Logging Log4Net RollingFileAppender未使用低容量日志刷新IO缓冲区

Logging Log4Net RollingFileAppender未使用低容量日志刷新IO缓冲区,logging,io,buffer,log4net,flush,Logging,Io,Buffer,Log4net,Flush,我在思考这个问题。据我们从简短的描述中所知,这是有报道的 我的问题本质上是,只有在应用程序关闭时(甚至在事件发生数周后)才会记录事件。当日志记录量非常低时会发生这种情况。我在WindowsServer2008R2上看到了这一点。这使我们无法捕获生产错误并对其作出反应 现在,appender不是一个缓冲程序。默认情况下,每次追加消息时,它也会对基础流调用Flush() 我的问题是为什么它没有冲洗?还有什么补救办法吗?你会考虑一个可行的解决办法吗? appender配置: 更新日期2013-06

我在思考这个问题。据我们从简短的描述中所知,这是有报道的

我的问题本质上是,只有在应用程序关闭时(甚至在事件发生数周后)才会记录事件。当日志记录量非常低时会发生这种情况。我在WindowsServer2008R2上看到了这一点。这使我们无法捕获生产错误并对其作出反应

现在,appender不是一个缓冲程序。默认情况下,每次追加消息时,它也会对基础流调用Flush()

我的问题是为什么它没有冲洗?还有什么补救办法吗?你会考虑一个可行的解决办法吗? appender配置:


更新日期2013-06-19

我无法用任何代码重现这种行为。无论我怎么努力,数据总是立即写入磁盘。但是,有一个重要的观察结果:如果对文件的第一次写入大于1KB,则修改的时间永远不会随后续写入而更新。仅当文件随关闭时间关闭时,才会更新该文件。另一方面,如果第一次写入是短的单行程序,则任何后续写入都将更新修改后的时间。此行为在log4net和手动IO操作之间、32位WinXP和64位W2k8R2之间以及.NET 2.0、3.5和.NET 4.0之间是一致的。这仍然不能解决问题,但至少我现在可以理解奇怪的修改时间模式


谢谢,Rob

因为您只关心错误级别或更糟糕的日志事件,而且幸运的是流量很少,所以我建议您将appender配置为立即刷新


这使您不必在每个日志事件上以编程方式刷新appender(从声音上看,它根本不起作用)。现在,如果希望将appender打开到更高的日志级别,那么立即刷新所有事件当然会带来更大的性能问题

编辑

我添加了配置文件和一个用于测试的简单主程序。使用以下命令,我确实看到日志事件立即刷新。关于您的评论,我还可以从xml中去掉
ImmediateFlush
行,并查看默认的
true
值。我在示例中保留这行代码是为了明确说明所需的行为

基本主程序:

类程序
{
静态void Main(字符串[]参数)
{
iloglog=LogManager.GetLogger(typeof(Program));
配置(新文件信息(@“C:\temp\logTest.config”);
串味精;
而((msg=Console.ReadLine())!=“完成”)
{
日志错误(msg);
}
LogManager.Shutdown();
}
}
主程序引用的logTest.config:



你能发布你正在使用的appender的配置吗?@AdamS,config补充道,谢谢你,并澄清一下,在这段时间内,当至少发生一次错误级别或更高的日志记录事件时,你是否没有看到日志每小时滚动一次?我用你的appender进行了测试,发现日志刷新并正确滚动。@AdamS,当1)应用程序启动时出现错误,然后应用程序保持安静时,问题通常会显现出来-没有更多日志事件来滚动日志。2) 如果在滚动期间之后有后续日志事件,则会清除上一个日志文件(我认为,因为IO流当时已正确关闭)。无论是在第1种情况还是第2种情况下,日志事件都会延迟到达文件。谢谢@AdamS,尽管我敢不同意。如果您查看
private bool m_immediateFlush=true的代码
覆盖受保护的void Append(LoggingEvent LoggingEvent)
在中,您会同意我的观点,默认情况下ImmediateFlush为true,因此appender实际上会在每个Append()上调用Flush(),正如我在Q中所说的。使用我使用的测试程序编辑了我的答案。有了这些,我可以看到事件立即被刷新。你没有看到同样的行为吗?谢谢亚当斯,这是个好主意。亚当斯,我已经更新了Q-更新2013-06-19。我感谢你迄今为止在这方面所做的努力。我猜一个可接受的答案听起来可能真的是“如果你不能复制它,它不是一个bug”:D我开始怀疑警报收集器中到底有问题。解决了!它是W2k8和我们的日志解析工具。W2k8附带了延迟修改时间更新“功能”:我们的工具在3天后删除了日志文件检查点。总之,这造成了一种错误的感觉和混乱,即日志记录被延迟了。复制的行为是,除非第一次写入很小,否则直到关闭文件写入句柄,修改才会更新,然后在每次后续写入时更新。这是一个奇怪的特征