为什么Log4Net过滤器接收评估器阈值之外的消息?



我的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消息,按照评估器阈值。这可能吗?

第二个问题——似乎首先应用过滤器,然后是评估器阈值(这对我来说是反直觉的)。这个假设正确吗?

对于您的第一个问题,直接在appender上设置阈值以获得最佳性能:

<appender name="SmtpAppender" type="log4net.Appender.SmtpAppender">
  <to value="xxx" />
  <from value="xxx" />
  ...
  <threshold value="ERROR"/>

请参阅此邮件列表中关于阈值和评估器的区别的帖子

阈值和求值器之间的区别是什么?

<!-- appender ... -->
<evaluator type="log4net.Core.LevelEvaluator">
  <threshold value="ERROR"/>
</evaluator>
<threshold value="ERROR" />

一个比另一个更早丢弃消息吗?

答:

阈值与求值器不同。

阈值在AppenderSkeleton中实现,因此几乎所有的appender都支持。这只是一个简单的测试用于忽略级别低于阈值的日志事件。早期检查阈值,作为一个简单的测试是非常重要的性能。

这篇文章接着谈到了Evaluator,它不是用来过滤消息的,而是用来触发发送缓冲消息的:

求值器是一个可插入的对象BufferingAppenderSkeleton来确定日志事件是否不应该被缓冲,而不是立即写入/发送。如果评估员决定该事件是重要的然后整个内容当前缓冲区将与事件一起发送。求值器做它不像阈值或过滤器那样起作用丢弃事件。

过滤器是这样说的:

过滤器具有很大的灵活性,因为多个过滤器可以链接在一起,以提供对事件的细粒度控制这就是输出。正因为如此,他们也有更高的成本在性能方面,链中的每个筛选器都是一个对象,并且被要求执行决定正确的行动方针。

在简单的情况下阈值过滤中应使用阈值属性筛选器的首选项。

最新更新