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