【发布时间】: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