java+log4j+是异步吗_log4j 异步日志问题分析

3. log4j 2.x 异步日志问题的解决方案及分析

3.1 log4j 2.x 异步日志问题的解决方案

3.2 log4j 2.x 异步日志性能高的关键

1. 常用的DailyRollingFileAppender与RollingFileAppender是否同步?

1.1 代码分析

DailyRollingFileAppender

RollingFileAppender

WriterAppender.append(LoggingEvent event)

QuietWriter.write(String string)

分析代码来看,最终依靠QuietWriter的write方法,这个方法是同步的。

e2e99dbf17b47afb49192015fef897fb.png

那么非常清晰的说明了这两个appender不是异步的。

2. log4j 1.2.x提供了异步appender是什么?AsyncAppender

2.1 AsyncAppender配置

官方解释,AsyncAppender必须使用xml形式的配置

Important note: The AsyncAppender can only be script configured using the DOMConfigurator.

2.2 AsyncAppender分析

根据配置文件发现,AsyncAppender并不是真正能写日志文件的appender,而是引用RollingFileAppender等。 AsyncAppender靠org.apache.log4j.AsyncAppender.Dispatcher这个类来实现异步调用appender写日志的动作。Dispatcher最终用作一个守护线程。靠buffer变量(是一个ArrayList)的wait与notify来搞定buffer中有日志事件的时候再做调用appender写日志动作。

部分分析参见下面截图:

b9eb7af7b561144498e371c303546b45.png

ea9a97143ed340befa30dfead31f3038.png

8bf34f5376a5e416c19dc7282413491e.png

3. log4j 2.x 异步日志问题的解决方案及分析

3.1 log4j 2.x 异步日志问题的解决方案

3.2 log4j 2.x 异步日志性能高的关键

采用了 disruptor提供的队列。后面有文章详细分析。


版权声明:本文为weixin_36048838原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。