初步测试了Log4性能。Appender架构以下。html
通常客户端,使用FileAppender,把Log记录在本地磁盘。数据库
<lockingModel type="log4net.Appender.FileAppender+InterProcessLock"/>
lockingModel影响性能。有三种模式:ExclusiveLock,MinimalLock,InterProcessLock。架构
默认是ExclusiveLock,此时若程序打开且第一次写Log后,Log文件就被锁定,Log文件没法删除。并发
MinimalLock是最小锁,速度很慢。由于每次都打开关闭文件。程序打开时,Log可实时删除,证实确实最小化锁文件。app
InterProcessLock,进程间锁。速度不慢与ExclusiveLock类似。且提供进程间同步,内部使用了Mutex。性能
客户端程序,若容许打开多个,则必须使用InterProcessLock锁。若使用其余两种锁,会出现并发问题。现象就是能出现怪异的文件目录,这事Log4自身bug引发。好比目录为以下:\Logs\2015-12\2015-12-06-11.log,并发问题产生后,出现以下目录:Logs\2015-12\2015-12-06-11.log2015-12\2015-12-06-11.log。若客户端仅仅容许一个进程打开,则使用ExclusiveLock,速度最快。应该比MinimalLock快20X。测试
对于Web端,仍是使用ExclusiveLock便可,ASP.Net网站通常不会多进程写Log。网站
但咱们追求性能时,但愿使用BufferingAppenderSkeleton下的类。但测试发现了问题,比没有Buffer的更慢。编码
在此贴中有外国人描述了现象。http://stackoverflow.com/questions/11319319/log4net-bufferingforwardingappender-performance-issue。是因为Buffer类型,要对每一个LogEvent数据Fix下一些易变的数据(log4net.Core.LoggingEvent.FixVolatileData方法很是耗时),但Fix什么数据是Flag Enum类型,是可配置的。以为<Fix value="12"/> 够用,并且速度大大提高。spa
使用Buffer类型后,发现文件锁lockingModel的影响变小,由于Buffer致使写文件次数大大下降,即便使用MinimalLock锁,性能影响也不大。
Buffer类型虽然对繁忙系统Log性能大大提高,但会对于较少Log系统的系统形成影响,由于写Log不及时,可能好久也没法写入磁盘或数据库。致使出现问题时,Log在内存,没法查看Log。
给出以下配置,有些配置节多是冗余,不是很严谨,本身用的。
<?xml version="1.0" encoding="utf-8"?> <log4net> <appender name="LocalFileAppender" type="log4net.Appender.RollingFileAppender,log4net"> <!--日志文件路径,按文件大小方式输出时在这里指定文件名,而且前面的日志按天在文件名后自动添加当天日期造成文件--> <param name="File" value="Logs\"/> <!--是否追加到文件--> <param name="AppendToFile" value="true"/> <!--ExclusiveLock,MinimalLock,InterProcessLock--> <lockingModel type="log4net.Appender.FileAppender+InterProcessLock"/> <!--Unicode编码--> <Encoding value="UTF-8"/> <!--最多产生的日志文件数,value="-1"为不限文件数--> <param name="MaxSizeRollBackups" value="1000"/> <!--是否只写到一个文件中--> <param name="StaticLogFileName" value="false"/> <!--按照何种方式产生多个日志文件(日期[Date],文件大小[Size],混合[Composite])--> <param name="RollingStyle" value="Date"/> <!--按日期产生文件夹,文件名[在日期方式与混合方式下使用]--> <param name="DatePattern" value="yyyy-MM\\yyyy-MM-dd-HH'.log'"/> <!--每一个文件的大小。只在混合方式与文件大小方式下使用,超出大小的在文件名后自动增长1从新命名--> <param name="MaximumFileSize" value="50KB" /> <!--记录的格式。--> <layout type="log4net.Layout.PatternLayout"> <param name="ConversionPattern" value="%d [%t] %-5p %c %n - %m%n"/> </layout> </appender> <appender name="BufferingForwardingAppender" type="log4net.Appender.BufferingForwardingAppender"> <bufferSize value="512" /> <appender-ref ref="LocalFileAppender" /> <Fix value="12"/> <!--Mdc:1;Ndc:2;Message:4;ThreadName:8;LocationInfo:16;UserName:32;Domain:64;Identity:128;Exception:256;Properties:512;None:0;All:268435455;Partial:844 http://stackoverflow.com/questions/11319319/log4net-bufferingforwardingappender-performance-issue--> </appender> <root> <level value="ALL" /> <appender-ref ref="BufferingForwardingAppender" /> </root> </log4net>
另外发现,RollingStyle为Date时,设置DatePattern到秒级别HH:mm:ss,并不是每秒一个Log文件。是由于,Log4的Roll探测精度默认为1分钟。并且最高时间精度是1分钟。