3

log4net 中的有损日志记录非常适合以最小的性能损失获取导致错误的事件的详细信息。然而,在错误之后记录一些消息以验证系统是否按计划处理它通常会很有趣。怎么做到呢?

4

2 回答 2

5

我会编写一个自定义版本的BufferingForwardAppender,它会在发生错误后记录可配置数量的消息。基本上,您在出现错误一段时间后关闭“有损”并直接转发所有消息。

注意:确保在记录错误时附加程序立即刷新消息,因为您无法确定错误之后是否还有其他消息。

于 2011-06-08T08:24:25.960 回答
4

接受的答案就像一个魅力。为简化起见,我没有对错误后的消息数量进行单独设置。而是在触发消息后无损发送一个完整缓冲区 + 1。编码:

public class BufferingForwardingAppenderEx : BufferingForwardingAppender
{
    /// <summary>
    /// If in lossy-mode, set the appender to non-lossy after a send has been done to get what happended after.
    /// </summary>
    public bool NonLossyAfterTriggered { get; set; }

    // Flag that tells if the appender is currently in non-lossy-override-mode
    private bool _nonLossyOverride = false;

    protected override void SendBuffer(global::log4net.Core.LoggingEvent[] events)
    {
        if (NonLossyAfterTriggered)
        {
            SetLossyAccordingToReasonForSending(events);
        }

        base.SendBuffer(events);
    }

    private void SetLossyAccordingToReasonForSending(LoggingEvent[] events)
    {
        if (_nonLossyOverride)
        {
            var newestEvent = events[events.Length - 1];
            var bufferIsSentBecauseItIsFull = !Evaluator.IsTriggeringEvent(newestEvent);

            if (bufferIsSentBecauseItIsFull)
            {
                _nonLossyOverride = false;
                Lossy = true;
            }
        }
        else
        {
            _nonLossyOverride = true;
            Lossy = false;
        }
    }
}

这是一个如何配置的示例:

<appender name="BufferingForwardingAppender"
          type="Foo.log4net.BufferingForwardingAppenderEx">
  <bufferSize value="3"/>
  <lossy value="true"/>
  <nonLossyAfterTriggered value="true" />
  <evaluator type="log4net.Core.LevelEvaluator">
    <threshold value="WARN"/>
  </evaluator>
  <appender-ref ref="ConsoleAppender"/>
</appender>

<appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender">
  <layout type="log4net.Layout.PatternLayout">
    <conversionPattern
      value="%date{yyyy-MM-dd HH:mm:ss} %-5level %-13logger{1} %message%newline"/>
  </layout>
</appender>

<root>
  <level value="DEBUG"/>
  <appender-ref ref="BufferingForwardingAppender"/>
</root>

使用这种配置,一个单独的警告(或更糟)之前有 2 条消息,然后是 4 条消息。

于 2011-06-08T12:59:23.513 回答