初步测试了Log4性能。Appender架构如下。

一般客户端,使用FileAppender,把Log记录在本地磁盘。

<lockingModel type="log4net.Appender.FileAppender+InterProcessLock"/>

lockingModel影响性能。有三种模式:ExclusiveLock,MinimalLock,InterProcessLock。

默认是ExclusiveLock,此时若程序打开且第一次写Log后,Log文件就被锁定,Log文件无法删除。

MinimalLock是最小锁,速度很慢。因为每次都打开关闭文件。程序打开时,Log可实时删除,证明确实最小化锁文件。

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"/>  够用,而且速度大大提升。

使用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分钟。

最新文章

  1. callee
  2. 与众不同 windows phone (44) - 8.0 位置和地图
  3. JS cookie的使用
  4. mongodb的安装及注意事项
  5. JAVA正则忽略大小写
  6. Linux on Power 上的调试工具和技术
  7. srand() rand() time(0)
  8. 解决warning: incompatible implicit declaration of built-in function &amp;#39;malloc&amp;#39;
  9. 忽然想到:QProcess的Read功能太强,如果有什么搞不定的,可以调用外部程序 good
  10. nodejs - 守护进程 supervisor
  11. (cljs/run-at (JSVM. :all) &quot;Metadata就这样哦&quot;)
  12. Alibaba(阿里) RocketMQ入门实例
  13. 常用类:Object
  14. .NET Core 实践二:事件通知和异步处理
  15. python -- 面向对象三大特性
  16. python 全栈开发,Day15(递归函数,二分查找法)
  17. Java内存模型及Java关键字 volatile的作用和使用说明
  18. C语言typeof详解
  19. hadoop学习笔记(一):概念和组成
  20. 在64位的UBUBTU 服务器 ***

热门文章

  1. curl命令测试https
  2. 编程算法 - 求1+2+...+n(构造函数) 代码(C++)
  3. 二路归并排序的java实现
  4. Xcode wifi连接真机调试
  5. Memcached 常用的方法
  6. mysql 考勤表异常 【待修改】
  7. Shiro 认证失败返回JSON
  8. vue实践---根据不同环境,自动转换请求的url地址
  9. Idiomatic Phrases Game(图论最短路)
  10. echart 图表自定义样式