我一直在考虑优化我的 Log4J 配置以提高吞吐量并减少延迟,并且我正在尝试确定最佳设置。我正在处理一个系统,其中代码必须无错误、可靠,并且按照从最重要到最不重要的顺序,系统性能是重中之重。
对我来说,很明显异步记录器在最佳性能方面是明显的赢家,这是完全有道理的。我不明白随机访问文件附加器与缓冲文件附加器的权衡。我查看了log4j网站here但我没有看到使用随机访问文件附加器有任何真正的缺点。
有人可以解释一下这些差异,并解释一下何时应该使用它们吗?
最佳答案
兴趣点:
- RandomAccessFileAppender 始终处于缓冲状态。从 beta-9 开始,缓冲区大小为 256 * 1024 字节且不可配置。这将在下一个版本中变得可配置。
FileAppender 可以使用
bufferedIO
属性进行配置以进行缓冲或不缓冲。从 beta-9 开始,缓冲区大小为 8 * 1024 字节且不可配置。这将在下一个版本中变得可配置。在底层,FileAppender 使用 java.io.FileOutputStream,它可以包装在 BufferedOutputStream 中。 RandomAccessFileAppenders 写入 ByteBuffer,当缓冲区已满或调用
flush()
时,该 ByteBuffer 会附加到 RandomAccessFile 的末尾。应该没有太大差异(除了性能之外),但 FileAppender 具有更长的跟踪记录,并且较新的 RandomAccessFileAppender 可能仍然存在尚未发现的问题。滚动似乎对于两种类型的附加程序都工作得很好,但可能存在团队尚不了解的极端情况。 (Log4J2 正在积极开发中,任何问题都会得到迅速解决。)RandomAccessFileAppender 和 FileAppender 都可以使用
immediateFlush
属性进行配置,以将每个日志事件刷新到磁盘。我建议您在使用 AsyncAppenders 或 AsyncLoggers 时关闭 immediateFlush ,这样您就可以利用它们提供的良好批处理行为:异步附加程序和记录器可以在记录多个事件后刷新,并且在队列结束时也肯定会刷新一次再次清空,效率很高,同时保证所有日志事件始终持久化到磁盘。
关于java - 何时在 log4j 配置中使用随机访问文件追加器与缓冲文件追加器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19323517/