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

时间:2015-10-20 00:19:13

标签: .net log4net log4net-filter

我的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 个答案:

答案 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确定是否不应该记录日志事件   被缓冲,但是立即写入/发送。如果是评估员   决定事件是重要的,然后是整个内容   当前缓冲区将与事件一起发送。 评估员做了   不像阈值或过滤器那样起作用   丢弃事件。

在过滤器上有这个说法:

  

过滤器具有很大的灵活性,因为多个过滤器可以   被捆绑在一起,为事件提供细致的控制   这是输出。因此,它们的成本也较高   对于性能,链中的每个过滤器都是一个对象并被要求   决定正确的行动方案。

     

在简单的情况下   阈值过滤应该使用阈值属性   偏好过滤器。