Lossy logging, также получать сообщения после ошибки?

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

2 ответа

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

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


Принятый ответ работал как шарм. Чтобы упростить, я не сделал отдельную настройку количества сообщений после ошибки. Вместо этого один полный буфер + 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">
 </threshold></evaluator>
 </nonlossyaftertriggered></lossy></buffersize></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">
 </conversionpattern></layout>
</appender>
<root>
 <level value="DEBUG">
 </level></root>

При такой конфигурации одиночное предупреждение (или, что еще хуже) предшествует 2, а затем 4 сообщения.

licensed under cc by-sa 3.0 with attribution.