为什么Log4Net过滤器会接收到超出评估器阈值的消息?

4

我的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消息,根据评估器阈值。这可行吗?
其次,似乎先应用过滤器,然后再应用评估器阈值(这对我来说是违反直觉的)。这个假设是正确的吗?
1个回答

5

针对您的第一个问题,为了达到最佳性能,在应用程序上直接设置阈值:directly on the 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中实现,因此几乎所有的附加器都支持它。这只是一个简单的测试,用于忽略级别低于阈值的日志事件。阈值早期检查并且作为简单测试非常高效。

文章接下来说了关于评估器的情况,它不是用于过滤信息,而是用于触发发送缓冲区中的消息:

评估器是可插拔对象,由BufferingAppenderSkeleton使用,以确定是否应该将日志事件缓冲,而不是立即写入/发送。如果评估器决定该事件很重要,则当前缓冲区的整个内容将随事件一起发送。评估器不像阈值或过滤器那样丢弃事件。

关于过滤器,它有很大的灵活性,因为多个过滤器可以链接在一起,以提供对输出事件的细粒度控制。由于这个原因,它们在性能方面的成本也更高,链中的每个过滤器都是一个对象,并被要求决定正确的行动。在阈值过滤的简单情况下,应该优先使用Threshold属性而不是过滤器。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接