在Java中快速登录多线程环境

时间:2014-01-05 14:31:26

标签: 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多行

1 个答案:

答案 0 :(得分:2)

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

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

AsyncLoggers的

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

您可能还想使用Log4j2中新增的RandomAccessAppender,因为它比标准的FileAppender更快。 RandomAccessAppender和FileAppender与异步日志记录一起使用immediateFlush="false"进行配置,所有事件仍然会刷新到磁盘(这是我对Log4j-1.x的主要抱怨)。

根据您的特殊需求,在20秒内记录330MB,我建议从默认的AsyncLogger.RingBufferSize开始,因为它非常大,有256K事件的空间,但如果这个结果不足则可以是配置了系统属性。