我尝试了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/