【问题标题】:Why sometimes Log4net events are logging with random event count, though buffer size is already configured?为什么有时 Log4net 事件会记录随机事件计数,尽管缓冲区大小已经配置?
【发布时间】:2019-01-01 07:19:28
【问题描述】:

我已经在我的自定义记录器类中实现了 BufferingAppenderSkeleton 并覆盖了用于在数据库中记录批处理日志的 SendBuffer 方法。

这是一个实现:

protected override void SendBuffer(LoggingEvent[] events)
    {
        List<Log> logs = new List<Log>();
        if (events != null && events.Length > 0)
        {
            foreach (var log in events)
            {
                var logWithLogSessionId = GetLogWithLogSession(log);
                logs.Add(logWithLogSessionId);
            }
        }     
        Analytics.SaveLogs(logs);
    }

这里是 log4net 的 web.config 配置:

<log4net>
<appender name="LogAppender" type="MyApp.LogAppender">
  <bufferSize value="20"/>
</appender>
<root>
  <level value="DEBUG"/>
  <appender-ref ref="LogAppender"/>
</root>

根据documentation,仅当事件计数达到配置的缓冲区大小时才会触发此方法,但有时这是随机事件计数调用。

例如。 有时当缓冲区中只有 1 个事件时触发,有时当事件计数达到缓冲区大小 + 1 等时触发?

【问题讨论】:

  • 您是否在类本身中设置任何其他附加程序选项?读取BufferingAppenderSkeleton 源,行为非常一致(缓冲区已满时输出 21 个事件)。除非你使用Lossy 和/或Evaluator ?
  • 不,我通过调用 ActivateOptions() 方法只设置了默认选项。
  • 你试过不打电话给ActivateOptions吗?除非您实际上更改了适配器构造函数中的选项,否则我认为您不需要/不应该调用它...不确定它是否有任何区别...
  • 根据文档,应调用 ActivateOptions() 来初始化用户定义的配置,如缓冲区大小和 log4net 的其他配置。尽管我浏览了 BufferingAppenderSkeleton 的源代码并发现上述行为是一种功能,但我认为调用此方法不会产生这样的问题。

标签: c# .net logging buffer log4net


【解决方案1】:

BufferSize 属性表示可以存储在内存中的事件数,而不是SendBuffer 方法中要发送的事件数。如果您将BufferSize 设置为 20,则第 21 个事件将触发该方法,并将与其他事件一起发送。检查BufferingAppenderSkeleton 类中的SendFromBuffer 方法。

所以基本上,如果您想批量发送 20 个事件,请将您的 BufferSize 设置为 19。

这似乎是错误的,但您需要了解BufferingAppenderSkeleton 中的Lossy 和Evaluator 属性是如何工作的。如果您将Lossy 设置为true,那么您将仅在内存中保留20 条最新/最重要的消息,并且在Evaluator 触发SendBuffer 之前忽略最旧的事件。检查Append 方法的实现以完全理解这一点。

【讨论】:

  • 感谢@Peska 的回答。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-08-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-27
  • 2017-07-10
  • 1970-01-01
相关资源
最近更新 更多