何时在log4j配置中使用随机访问文件附加器与缓冲文件附加器

时间:2013-10-11 16:59:41

标签: java configuration log4j log4j2

我一直在考虑优化我的Log4J配置以提高吞吐量并减少延迟,我正在尝试确定最佳设置。我正在处理一个系统,其中代码必须是无错误的,可靠的,并且系统性能是最重要的,从最重要到最不重要。

对我来说,异步记录器在最佳性能方面显然是明显的赢家,而且完全合理。我不理解随机访问文件附加器与缓冲文件附加器的权衡。我查看了log4j网站here,但我没有看到使用随机访问文件附加程序的任何真正的缺点。

有人可以解释一下这些差异,并说明何时应该使用它们?

2 个答案:

答案 0 :(得分:2)

兴趣点:

  • RandomAccessFileAppenders始终是缓冲的。从beta-9开始,缓冲区大小为256 * 1024字节,不可配置。这将在下一版本中配置。
  • 可以使用bufferedIO属性配置FileAppenders以进行缓冲。从beta-9开始,缓冲区大小为8 * 1024字节,不可配置。这将在下一版本中配置。

  • 在幕后,FileAppenders使用java.io.FileOutputStream,它可以包装在BufferedOutputStream中。 RandomAccessFileAppenders写入ByteBuffer,当缓冲区已满或调用flush()时,ByteBuffer附加到RandomAccessFile的末尾。应该没有太大差异(除了性能)但FileAppenders有更长的跟踪记录,并且可能仍然存在尚未发现的较新的RandomAccessFileAppender的问题。翻转似乎适用于两种类型的appender,但可能存在团队尚未了解的极端情况。 (Log4J2正在积极开发中,任何问题都将得到迅速解决。)

  • 可以使用immediateFlush属性配置RandomAccessFileAppenders和FileAppender,以将每个日志事件刷新到磁盘。我建议您在使用AsyncAppenders或AsyncLoggers时关闭immediateFlush,这样您就可以利用它们提供的良好批处理行为:异步appender和logger在记录多个事件后可以刷新,并且当队列再次为空时也肯定会刷新一次,这是非常有效的,同时确保所有日志事件始终保持在磁盘上。

答案 1 :(得分:0)

随机访问直接写入文件而不进行缓冲。这比缓冲写入更慢但更可靠,因为缓冲写入可能会在发生崩溃时丢失一些未刷新的写入。您需要决定哪个对您更重要。从你的三个清单中不清楚。

编辑人们会期望一个名为RandomAccessAppender的班级会使用随机访问,这意味着没有缓冲,但显然它没有!