我的log4net配置是这样的:
<appender name="SmtpAppender" type="log4net.Appender.SmtpAppender">
<to value="xxx" />
<from value="xxx" />
...
<evaluator type="log4net.Core.LevelEvaluator">
<threshold value="ERROR"/>
</evaluator>
<filter type="MyApp.Logging.EmailLogThrottler">
</filter>
</appender>
如果我在MyApp.Logging.EmailLogThrottler
类中设置断点,我看到它正在接收要过滤的INFO消息。 EmailLogThrottler相当昂贵,因此我只希望它根据评估者阈值接收ERROR消息。这可能吗?
次要问题 - 似乎首先应用过滤器然后应用评估器阈值(这对我来说是反直觉的)。这个假设是否正确?
答案 0 :(得分:5)
关于第一个问题,请直接在appender 上设置阈值以获得最佳效果:
<appender name="SmtpAppender" type="log4net.Appender.SmtpAppender">
<to value="xxx" />
<from value="xxx" />
...
<threshold value="ERROR"/>
请参阅this mailing list post on the difference between threshold and evaluator
<!-- appender ... -->
<evaluator type="log4net.Core.LevelEvaluator">
<threshold value="ERROR"/>
</evaluator>
<threshold value="ERROR" />
是否会比其他人更快地丢弃消息?
阈值与评估者不同。
阈值在AppenderSkeleton中实现,因此 几乎所有的appender支持。这只是一个简单的测试 用于忽略级别低于阈值的日志记录事件。 早期检查阈值,并且非常简单 高性能的。
关于评估者的帖子继续说这个,它不是为了过滤消息,而是为了触发发送缓冲的消息:
Evaluator是一个可插入的对象,由 BufferingAppenderSkeleton确定是否不应该记录日志事件 被缓冲,但是立即写入/发送。如果是评估员 决定事件是重要的,然后是整个内容 当前缓冲区将与事件一起发送。 评估员做了 不像阈值或过滤器那样起作用 丢弃事件。
在过滤器上有这个说法:
过滤器具有很大的灵活性,因为多个过滤器可以 被捆绑在一起,为事件提供细致的控制 这是输出。因此,它们的成本也较高 对于性能,链中的每个过滤器都是一个对象并被要求 决定正确的行动方案。
在简单的情况下 阈值过滤应该使用阈值属性 偏好过滤器。