我一直在考虑优化我的 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
的类将使用随机访问,这意味着没有缓冲,但显然它没有!