log4net - BufferingForwardingAppender - 刷新超时

时间:2013-10-11 09:09:36

标签: log4net log4net-configuration log4net-appender

我在某些时候有一连串的日志消息,所以出于性能原因我不得不放BufferingForwardingAppender。但是,除了这种爆发(发生这种情况,一天一次),在剩下的一天中,我会收到少量的日志消息。 问题是缓冲区大小设置为50,这对于突发时段是可以的,但对于没有突发的时段来说这太过分了。在此期间,刷新日志可能需要一两个多小时,这在此系统中是不可接受的。

如果没有足够的消息在缓冲区中触发通常的过程,是否有某种方法可以在特定的时间间隔(例如,每10分钟)使BufferingForwardingAppender刷新一次?

2 个答案:

答案 0 :(得分:5)

猜猜我有点迟到(3年),但经过相当多的搜索,我发现了一些可能有助于其他人解决这个问题的东西。这对我有用:

<appender name="MyBufferingForwardingAppender" type="log4net.Appender.BufferingForwardingAppender">
      <bufferSize value="1000" /> <!-- flush after 1000 log events -->
      <appender-ref ref="MyRollingFileAppender" />
      <lossy value="false" /> <!-- do not lose any logs -->
      <evaluator type="log4net.Core.TimeEvaluator">
        <interval value="2"/> <!-- flush every two seconds -->
      </evaluator>
</appender>

在OP情况下,他会使用<interval value="600"/>每10分钟记录一次消息。

答案 1 :(得分:1)

不是开箱即用,但您可以根据BufferingForwardingAppender创建自己的追加者:

private static DateTime lastFlushTime = DateTime.Now;
public class TimedBufferingForwardingAppender : BufferingForwardingAppender{
    override protected void Append(LoggingEvent loggingEvent) {
        if (lastFlushTime.AddMinutes(10) < DateTime.Now){
            SendBuffer(new LoggingEvent[] { loggingEvent } );
            lastFlushTime = DateTime.Now;
        }
    }
}