有感:在查询Log4Net详细的用法的时候,导出都是复制转载的文章,想找篇有见解的都很难;
想要在Log4Net中,把异常信息缓存起来,超过5条的时候,才批量输出,
经查结果得知,是用以下的appender,然后输出的操作,就交给<appender-ref ref="LogFileAppenderByDate" />指向的appender,名为LogFileAppenderByDate的appender,但是,我将两个appender设置好之后,始终不能生效,效果只有其中1个appender,没有缓存。
请问,还差哪里的设置了?
参考文章
http://www.cnblogs.com/anderslly/archive/2007/03/09/log4netconfigsamples.html
<appender name="BufferingForwardingAppender" type="log4net.Appender.BufferingForwardingAppender" >
<bufferSize value="5"/>
<lossy value="true" />
<evaluator type="log4net.Core.LevelEvaluator">
<threshold value="WARN"/>
</evaluator>
<appender-ref ref="LogFileAppenderByDate" />
</appender>
<!--按日期分割日志文件 一天一个-->
<appender name="LogFileAppenderByDate" type="log4net.Appender.RollingFileAppender" >
<!--是否续写-->
<param name="AppendToFile" value="true" />
<!--最小锁定模型以允许多个进程可以写入同一个文件-->
<param name="LockingModel" value="log4net.Appender.FileAppender.MinimalLock" />
<param name="StaticLogFileName" value="true" />
<!--保存路径-->
<param name="File" value="C:\Log\\" />
<param name="DatePattern" value="yyyy-MM-dd.LOG" />
<param name="StaticLogFileName" value="false" />
<param name="RollingStyle" value="Date" />
<layout type="log4net.Layout.PatternLayout">
<param name="ConversionPattern" value="时间:%d %n级别:%level %n类名:%c%n文件:%F 第%L行%n日志内容:%m%n-----------------------------------------%n%n" />
</layout>
</appender>
园子里有很多原创的,比如:Log4Net 全方位跟踪程序运行
可以通过找找看搜索“log4net”,http://zzk.cnblogs.com/s?t=b&w=log4net
(4) BufferingForwardingAppender 在输出到子Appenders之前先缓存日志事件
我觉得这个appender,很多人都没配置过,那也很难怪了,log4net配置选项这么多。也不可能每项都去试一试,都是使用到的时候,才会更深入的了解。
@dotnetgeek: 是的
@dudu: 这是Log4Net官网截图下来的,怎么奇怪的?居然这么多都不知道.NetFramework ?
原文地址:http://logging.apache.org/log4net/release/framework-support.html
@dotnetgeek: BufferingForwardingAppender可以参考log4net BufferingForwardingAppender performance issue
@dotnetgeek: x是不是在这里表示支持?
@dudu:
用老外那个配置是OK。网上转载的文章中,配置多了好几个属性,反而是不行的。
我猜应该是这2个属性导致没有缓存到的。
<lossy value="true" />
<evaluator type="log4net.Core.LevelEvaluator">
<threshold value="DEBUG"/>
</evaluator>
@dotnetgeek: 建议通过博文分享你的心得
@dudu:
log4net我会写博客的,刚才又研究了一下,首先官网是这样子说的。
The following example shows how to configure the BufferingForwardingAppender to buffer 100 messages before delivering them to the ConsoleAppender.
<appender name="BufferingForwardingAppender" type="log4net.Appender.BufferingForwardingAppender" > <bufferSize value="100"/> <appender-ref ref="ConsoleAppender" /> </appender>
This example shows how to deliver only significant events. A LevelEvaluator is specified with a threshold of WARN. This means that the events will only be delivered when a message with level of WARN or higher level is logged. Up to 512 (BufferSize) previous messages of any level will also be delivered to provide context information. Messages not sent will be discarded.
<appender name="BufferingForwardingAppender" type="log4net.Appender.BufferingForwardingAppender" > <bufferSize value="512" /> <lossy value="true" /> <evaluator type="log4net.Core.LevelEvaluator"> <threshold value="WARN"/> </evaluator> <appender-ref ref="ConsoleAppender" /> </appender>
不知道我翻译有没有错,官网应该是这样说的,第二个例子,设定一个阈值,只会提交错误级别大于设置的阈值,如果低于的话,则不会记录,我刚才了写DEMO试了一下,当我设定阈值为:WARN 的时候,如果log.Debug("XX")的话,就不会被记录,然后log.Error("XX")的话,就每条都记录,不会产生缓存。
日志级别 FATAL> ERROR> WARN> INFO>DEBUG
那我就不明白,为什么log4net会在缓存这个appender还搞这种设置了。而很多博客就转载了官网的第二个例子,而又没有去验证。
@dotnetgeek: 似乎log.Error("XX")时,也会产生缓存,建议再确认一下
@dudu: 刚刚试了一下,我配置文件閾值是warn
<appender name="BufferingForwardingAppender" type="log4net.Appender.BufferingForwardingAppender" >
<bufferSize value="10" />
<lossy value="true" />
<evaluator type="log4net.Core.LevelEvaluator">
<threshold value="WARN"/>
</evaluator>
<appender-ref ref="LogFileAppenderByDate" />
</appender>
然後log.Error("XX") 没有产生缓存,是直接输出出来了。
@dotnetgeek:
明白了,FATAL> ERROR> WARN这些级别会直接写入日志;INFO>DEBUG级别的会写入缓存,用于提供上下文信息
@dudu: 现实的情况是,INFO>DEBUG级别的,没有写入到文件里,程序执行后,就生成了一个空的文件。这里我不太明白。
@dotnetgeek: <threshold value="WARN"/>就是为了INFO>DEBUG级别的只写入缓存,不写入文件。你可以设置为<threshold value="DEBUG"/>看看效果