Lossy logging, также получить некоторые сообщения после ошибки? - PullRequest
3 голосов
/ 08 июня 2011

Регистрация с потерями в log4net отлично подходит для получения подробной информации о событиях, приводящих к ошибке с минимальными потерями производительности.Однако часто было бы интересно также зарегистрировать несколько сообщений после ошибки, чтобы убедиться, что система обработала это, как планировалось.Как это можно сделать?

Ответы [ 2 ]

5 голосов
/ 08 июня 2011

Я бы написал пользовательскую версию BufferingForwardAppender , которая бы регистрировала настраиваемый номер сообщения после ошибки.Как правило, вы на некоторое время отключаете функцию «с потерями» и пересылаете все сообщения напрямую.

Примечание. Убедитесь, что аппендер сбрасывает сообщения сразу после регистрации ошибки, поскольку вы не можете быть уверены, чтобыть другие сообщения после ошибки.

4 голосов
/ 08 июня 2011

Принятый ответ работал как шарм. Для упрощения я не сделал отдельную настройку количества сообщений после ошибки. Вместо этого один полный буфер + 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 сообщения.

...