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

Rya*_*yan 4 .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>
Run Code Online (Sandbox Code Playgroud)

如果我在我的MyApp.Logging.EmailLogThrottler班级中设置断点,我看到它正在接收要过滤的INFO消息.EmailLogThrottler相当昂贵,因此我只希望它根据评估者阈值接收ERROR消息.这可能吗?

次要问题 - 似乎首先应用过滤器然后应用评估器阈值(这对我来说是反直觉的).这个假设是否正确?

stu*_*rtd 5

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

<appender name="SmtpAppender" type="log4net.Appender.SmtpAppender">
  <to value="xxx" />
  <from value="xxx" />
  ...
  <threshold value="ERROR"/>
Run Code Online (Sandbox Code Playgroud)

有关阈值和评估者之间的差异,请参阅此邮件列表帖子

阈值和评估者之间有什么区别?

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

<threshold value="ERROR" />
Run Code Online (Sandbox Code Playgroud)

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

回答:

阈值与评估者不同.

阈值在AppenderSkeleton中实现,因此几乎所有appender都支持.它只是一个简单的测试,用于忽略级别低于阈值的日志记录事件.早期检查阈值,因为简单的测试非常有效.

该帖子接着说明了这个关于评估器的内容,它不是为了过滤消息,而是为了触发发送缓冲的消息:

Evaluator是一个可插入的对象,BufferingAppenderSkeleton使用它来确定是否应该缓冲日志记录事件,而是立即写入/发送.如果Evaluator判定事件很重要,那么当前缓冲区的全部内容将与事件一起发送.评估程序不像阈值或过滤器那样起作用,因为它不会丢弃事件.

在过滤器上有这个说法:

过滤器具有很大的灵活性,因为可以将多个过滤器链接在一起,以便对输出的事件进行细粒度控制.因此,它们在性能方面也有较高的成本,链中的每个过滤器都是一个对象,并被要求决定正确的行动方案.

在阈值过滤的简单情况下,应优先使用阈值属性而不是过滤器.