log4net-BufferingForwardingAppender-刷新超时

log4net-BufferingForwardingAppender-刷新超时,log4net,log4net-configuration,log4net-appender,Log4net,Log4net Configuration,Log4net Appender,我在某些点上有大量日志消息,因此出于性能原因,我不得不将BufferingForwardingAppender。但是,除了这些突发事件(比如说,一天一次)之外,在一天剩下的时间里,我会收到少量日志消息。 问题是缓冲区大小被设置为50,这对于突发周期来说是可以的,但对于没有突发的周期来说这太多了。在此期间,刷新日志可能需要一到两个多小时,这在本系统中是不可接受的 如果缓冲区中没有足够的消息来触发通常的进程,是否有办法在特定的时间间隔(例如,每10分钟)内使缓冲转发出现刷新?不是现成的,但您可以根据

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


如果缓冲区中没有足够的消息来触发通常的进程,是否有办法在特定的时间间隔(例如,每10分钟)内使
缓冲转发出现
刷新?

不是现成的,但您可以根据以下内容制作自己的附加器:

private static DateTime lastFlushTime=DateTime.Now;
公共类TimedBufferingForwardingAppender:BufferingForwardingAppender{
覆盖受保护的void Append(LoggingEvent LoggingEvent){
if(lastFlushTime.AddMinutes(10)
我想我帮助别人有点晚了(3年),但在搜索了很多之后,我发现了一些可能有助于其他人解决这个问题的东西。这对我很有用:



在OP案例中,他会使用
每10分钟记录一次消息。

我认为唯一的问题是如果没有新事件出现,这将永远不会触发。是的,你是对的,但是当你有这个例子时,你也可以解决这个问题。当你在这里回答问题时,只要回答得很好,并且你遵守规则,这并不重要。这还存在一个问题,即如果10分钟后没有新事件出现,那么日志将永远不会刷新…。。。@bastos.sergio不会。具有特定间隔的TimeEvaluator在该间隔过后强制刷新。至少当我把这个答案发回来的时候,它对我来说是这样的好吧,我昨天试过了,但没有成功。缓冲区上的日志在时间段过期后未刷新。解决方案的关键在于,日志必须在10分钟结束后发生,才能刷新所有内容,如果没有发生,则缓冲区中的所有日志将保留在缓冲区中。。。。我的解决方法是在我的应用程序中的某些关键点手动刷新appender…我查看了“TimeEvaluator”的来源,它似乎只对新事件做出反应。当新事件出现时,它会检查时间是否过期。因此,在缓冲区中挂起一些日志项的场景中,只有一个新事件将刷新appender,如果经过指定的时间。
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;
        }
    }
}