logging - java中多线程环境中非常快的日志记录

标签 logging log4j java.util.logging log4j2

我尝试了logj4,将bufferedIO设置为true,asynappender,但是最后大约100行日志丢失了。

在 Java 中,我们必须以非常快的速度进行日志记录,那么在多线程环境中进行日志记录的更好技术是什么?

我们在大约 20 秒内记录了大约 330MB。我们可以清楚地看到记录在中间停止了。最后一行是 4094902:[11, 12, 17, 14, 15, 16, 13, 10, 3, 应该还有大约 200 行

最佳答案

您可能对 Log4j2 中新增的异步记录器感兴趣: http://logging.apache.org/log4j/2.x/manual/async.html

他们使用LMAX Disruptor在底层,这是一种无锁数据结构,旨在减少(甚至消除)锁争用,锁争用通常是多线程场景中的吞吐量瓶颈。

Performance AsyncLoggers 比 AsyncAppender 好很多,特别是当许多线程正在记录日志时。配置很简单,只需使用普通的 log4j2 配置(与 log4j-1.x 不同,顺便说一句)以及使所有记录器成为 AsyncLoggers 的系统属性。

您可能还想使用RandomAccessAppender这是 Log4j2 中的新增功能,因为它比标准 FileAppender 更快。 RandomAccessAppender 和 FileAppender 与异步日志记录相结合,都可以使用 immediateFlush="false" 进行配置,并且所有事件仍将刷新到磁盘(这是我对 Log4j-1 的主要提示)。 x)。

对于您的特殊需求,在 20 秒内记录 330MB,我建议从默认的 AsyncLogger.RingBufferSize 开始,因为它相当大,有容纳 256K 事件的空间,但如果结果是如果不够,可以通过系统属性进行配置。

关于logging - java中多线程环境中非常快的日志记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20934751/

相关文章:

java - 更改日志记录级别后,什么会捕获我的日志文件?

python - 如何在输出旁边显示 python 输入代码

class - 为 JBOSS 类加载启用日志记录

tomcat - Tomcat 7 上的 Grails 应用程序 : log4 daily log is overriting old backup logs

grails - Grails log4j配置

java - 在 java.util.logging 中,全局记录器有什么用?

java - 沉默 Flyway——一个 log4j 问题

php - 从php存储Logstash日志的最简单方法是什么

java - 使用 Log4j SyslogAppender 时定义 PatternLayout 的最佳实践

java - 哪个 weblogic jar 文件包含 com.bea.logging.BaseLogRecord?