1. 常用的DailyRollingFileAppender与RollingFileAppender是否同步?
2. log4j 1.2.x提供了异步appender是什么?AsyncAppender
3. log4j 2.x 异步日志问题的解决方案及分析
3.1 log4j 2.x 异步日志问题的解决方案
3.2 log4j 2.x 异步日志性能高的关键
1.1 代码分析
DailyRollingFileAppender
RollingFileAppender
WriterAppender.append(LoggingEvent event)
QuietWriter.write(String string)
分析代码来看,最终依靠QuietWriter的write方法,这个方法是同步的。
那么非常清晰的说明了这两个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写日志动作。
部分分析参见下面截图:
3. log4j 2.x 异步日志问题的解决方案及分析
3.1 log4j 2.x 异步日志问题的解决方案
3.2 log4j 2.x 异步日志性能高的关键
采用了 disruptor提供的队列。后面有文章详细分析。