log4j 异步日志问题分析

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

1.1 代码分析

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

2.1 AsyncAppender配置

2.2 AsyncAppender分析

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方法,这个方法是同步的。

2016-02-27 17-48-43_Debug - log4j1.2.15_src1.2.15_org_apache_log4j_helpers_QuietWriter

那么非常清晰的说明了这两个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写日志动作。

部分分析参见下面截图:

2016-02-27 21-40-21_Debug - log4j1.2.15_src1.2.15_org_apache_log4j_AsyncAppender

2016-02-27 21-40-57_Java VisualVM

2016-02-27 21-40-09_Debug - log4j1.2.15_src1.2.15_org_apache_log4j_AsyncAppender

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

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

log4j2异步日志配置及官方文档的问题澄清

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

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

原文地址:https://www.cnblogs.com/simoncook/p/5223265.html