一、log4j2异步配置
1、启动位置设置
System.setProperty("Log4jContextSelector", "org.apache.logging.log4j.core.async.AsyncLoggerContextSelector");
2、引入异步日志依赖
<dependency>
<groupId>com.lmax</groupId>
<artifactId>disruptor</artifactId>
<version>3.3.7</version>
</dependency>
注意版本需要3以上
3、日志配置文件
<Appenders>
<RollingRandomAccessFile name="file" fileName="${LOG_HOME}/${FILE_NAME}.log"
filePattern="${LOG_HOME}/${FILE_NAME}_%d{yyyy-MM-dd}-%i.log"
immediateFlush="false">
<PatternLayout pattern="${LOG_PATTERN}"/>
<Policies>
<TimeBasedTriggeringPolicy interval="1"/>
<SizeBasedTriggeringPolicy size="100 MB"/>
</Policies>
<DefaultRolloverStrategy max="50"/>
</RollingRandomAccessFile>
<RollingRandomAccessFile name="errorLog" fileName="${LOG_HOME}/error/${FILE_NAME}-error.log"
filePattern="${LOG_HOME}/error/${FILE_NAME}-error-%d{yyyy-MM-dd}.log">
<PatternLayout pattern="${LOG_PATTERN}"/>
<Policies>
<SizeBasedTriggeringPolicy size="50 MB"/>
</Policies>
<Filters>
<!-- 只记录error级别信息 -->
<ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/>
</Filters>
<!-- 指定每天的最大压缩包个数,默认7个,超过了会覆盖之前的 -->
<DefaultRolloverStrategy max="50"/>
</RollingRandomAccessFile>
</Appenders>
<root level="info" includeLocation="true">
<appender-ref ref="file" />
<appender-ref ref="errorLog" />
</root>
注意还是使用<root>标签,而不是<asyncRoot>,asyncRoot标签仅为混合同步异步使用。
增加includeLocation="true",immediateFlush="false"
以上三步,即可实现log4j2异步日志,缺一不可
二、spring boot改log4j2
1、若引入了spring-boot-starter-web,则需要去除spring boot的默认日志框架logback
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions><!-- 去掉默认配置 -->
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
2、添加log4j2
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
三、logId实现
ThreadContext.put("logId", "logId");
ThreadContext.remove("logId");
在接受rpc或http请求的地方添加logId,请求结束删除。
这个方法无法实现多线程同一个logId,并且使用MDC的方式对log4j2无效
多线程logId实现还待研究,希望留言交流。