何时在 log4j 配置中使用随机访问文件追加程序与缓冲文件追加程序



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

在我看来,异步记录器在最佳性能方面是明显的赢家,这是完全有道理的。 我不明白随机访问文件追加器与缓冲文件追加器的权衡。 我在这里查看了log4j网站,但我没有看到使用随机访问文件追加器的任何真正缺点。

有人可以解释一下差异,并解释何时应该使用每种差异吗?

兴趣点:

  • RandomAccessFileAppenders总是缓冲的。从 beta-9 开始,缓冲区大小为 256 * 1024 字节,且不可配置。这将在下一个版本中变得可配置。
  • 可以使用要缓冲或不缓冲的 bufferedIO 属性配置文件追加程序。从 beta-9 开始,缓冲区大小为 8 * 1024 字节,不可配置。这将在下一个版本中变得可配置。

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

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

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

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

最新更新