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

2024-02-02

我的 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 相当昂贵,因此我只希望它根据评估器阈值接收错误消息。这可能吗?

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


对于第一个问题,设置阈值直接在附加器上为了获得最佳性能:

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

See 此邮件列表发布了阈值和评估器之间的差异 http://mail-archives.apache.org/mod_mbox/logging-log4net-user/200509.mbox/%3CDDEB64C8619AC64DBC074208B046611C7694A9@kronos.neoworks.co.uk%3E

阈值和评估器有什么区别?

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

<threshold value="ERROR" />

其中一个会比另一个更快地丢弃消息吗?

Answer:

阈值与评估者不同。

该阈值是在 AppenderSkeleton 中实现的,因此 几乎所有附加程序都支持。这只是一个简单的测试 用于忽略级别低于阈值的日志记录事件。 尽早检查阈值,并且作为一个简单的测试非常有用 表现出色。

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

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

它对过滤器有这样的说法:

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 Log4Net 过滤器接收到评估器阈值之外的消息? 的相关文章

随机推荐