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

标签 java configuration log4j log4j2

我一直在考虑优化我的 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/

相关文章:

debugging - 无法调试 pic32 微 Controller 或更新配置位

android - 在 Mac OS X 上哪里安装 Android SDK?

java - 无法从 JSON 转换;意外字符 ('f'(代码 102)): Expected space separating root-level values at (String )"5f19a7e99933db43cb23e83d"

java - 以编程方式更改 Log4j2 中的日志级别

java - 任务 ':compileDebugJavaWithJavac 执行失败

java - 如何使 Spring 将值注入(inject)静态字段

java - 如何修复 Tomcat 中的 log4j 警告消息

log4j - HTTPComponents 中的静默调试日志记录

java - Log4j2,文件中没有日志

java - 将参数传递给 Maven 发布版本