【问题标题】:Why do Log4Net Filters Receive Messages Outside of the Evaluator Threshold?为什么 Log4Net 过滤器会收到超出评估者阈值的消息?
【发布时间】:2015-10-20 00:19:13
【问题描述】:

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

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

【问题讨论】:

    标签: .net log4net log4net-filter


    【解决方案1】:

    对于您的第一个问题,直接在 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

    threshold 和 evaluator 有什么区别?

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

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

    答案:

    阈值与评估者不同。

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

    这篇文章继续说 Evaluator,它的目的不是过滤消息,而是触发发送缓冲的消息:

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

    过滤器上有这样的说法:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-08-11
      • 1970-01-01
      • 2019-07-27
      • 1970-01-01
      • 1970-01-01
      • 2015-04-03
      • 2015-01-25
      • 1970-01-01
      相关资源
      最近更新 更多