【问题标题】:log4net - BufferingForwardingAppender - flush with timeoutlog4net - BufferingForwardingAppender - 超时刷新
【发布时间】:2013-10-11 09:09:36
【问题描述】:

我在某些时候有大量的日志消息,因此出于性能原因我不得不输入BufferingForwardingAppender。但是,除了这种爆发(比如说,每天发生一次)之外,在一天的其余时间里,我会收到少量的日志消息。 问题是缓冲区大小设置为 50,这对于突发周期来说是可以的,但对于没有突发的周期来说,这太过分了。在此期间,刷新日志可能需要一两个多小时,这在本系统中是不可接受的。

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

【问题讨论】:

    标签: log4net log4net-configuration log4net-appender


    【解决方案1】:

    我想我有点晚了(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 情况下,他会使用 &lt;interval value="600"/&gt; 每 10 分钟记录一次消息。

    【讨论】:

    • 这里什么时候回答都没有关系,只要你回答得不错,而且你遵守规则。
    • 这也有问题,如果10分钟后没有新事件进来,那么日志永远不会刷新......
    • @bastos.sergio 它没有。具有特定间隔的 TimeEvaluator 在该间隔过去后强制刷新。至少当我当时发布这个答案时它对我有用
    • 嗯,我昨天试过了,但是没有用。时间段到期后,缓冲区上的日志没有刷新。解决方案的关键是必须在 10 分钟后刷新所有日志,如果没有发生,那么缓冲区上的所有日志都将保留在缓冲区中......我的解决方法是强制刷新 appender在我的应用程序中的某些关键点手动...
    • 我查看了“TimeEvaluator”的来源,似乎它只对新事件做出反应。当新事件到来时,它会检查时间是否过期。因此,在缓冲区中挂着一些日志项的情况下,只有一个新事件会刷新 appender 并且如果指定的时间过去了。
    【解决方案2】:

    不是开箱即用,但您可以根据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;
            }
        }
    }
    

    【讨论】:

    • 我认为唯一的问题是如果没有新事件进入,这将永远不会触发。
    • 是的,你是对的,但是当你有这个例子时,你也可以解决这个问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-16
    • 2017-07-10
    • 1970-01-01
    相关资源
    最近更新 更多