操作步骤
1. 排除默认的 logback 依赖,同时引入log4j2
<!-- 排除默认的 logback 依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<exclusions>
<exclusion>
<artifactId>spring-boot-starter-logging</artifactId>
<groupId>org.springframework.boot</groupId>
</exclusion>
</exclusions>
</dependency>
<!-- 引入log4j2依赖 disruptor 异步日志需要-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
<dependency>
<groupId>com.lmax</groupId>
<artifactId>disruptor</artifactId>
</dependency>
2. 配置全局使用log4j2 异步日志
在 resources 目录增加文件: log4j2.component.properties,内容如下:
# 设置异步日志系统属性
log4j2.contextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector
3. 增加日志打印配置文件
在 resources 目录增加文件: log4j2.xml,内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<configuration monitorInterval="60">
<Properties>
<!-- 日志输出格式 -->
<Property name="log.pattern"
value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{30} - [%method,%line] - %msg%n"/>
<!-- 活动文件的大小 -->
<Property name="max.file.size" value="524MB"/>
<Property name="logRootDir" value="${sys:logFile.dir}"/>
<!-- 保留的归档文件的最大数量 -->
<Property name="rolloverStrategy.max" value="30"/>
</Properties>
<Appenders>
<!-- 控制台输出 -->
<Console name="stdoutAppender" target="SYSTEM_OUT">
<!--输出日志的格式-->
<PatternLayout pattern="${log.pattern}" charset="UTF-8"/>
</Console>
<RollingFile name="rollingFileAppender" fileName="${logRootDir}/app.log"
filePattern="${logRootDir}/app-%d{yyyy-MM-dd}.%i.log">
<PatternLayout pattern="${log.pattern}" charset="UTF-8"/>
<Policies>
<TimeBasedTriggeringPolicy/>
<SizeBasedTriggeringPolicy size="${max.file.size}"/>
</Policies>
<DefaultRolloverStrategy max="${rolloverStrategy.max}"/>
</RollingFile>
<RollingFile name="callListLogFileAppender"
fileName="${logRootDir}/callist.log"
filePattern="${logRootDir}/callist-%d{yyyyMMdd}.%i.log">
<Policies>
<TimeBasedTriggeringPolicy/>
<SizeBasedTriggeringPolicy size="${max.file.size}"/>
</Policies>
<DefaultRolloverStrategy max="200"/>
</RollingFile>
</Appenders>
<Loggers>
<Logger name="CallList" additivity="false">
<appender-ref ref="callListLogFileAppender"/>
</Logger>
<Root level="INFO" includeLocation="true">
<appender-ref ref="rollingFileAppender"/>
<appender-ref ref="stdoutAppender"/>
</Root>
<!-- 下面配置一些第三方包的日志过滤级别,用于避免刷屏 -->
<Logger name="org.hibernate" level="WARN" includeLocation="true"/>
<Logger name="org.springframework" level="INFO" includeLocation="true"/>
<Logger name="com.opensymphony" level="WARN" includeLocation="true"/>
<Logger name="org.apache" level="INFO" includeLocation="true"/>
<Logger name="org.mybatis" level="INFO" includeLocation="true"/>
</Loggers>
</configuration>
log4j2 扩展知识
log4j2 异步日志扩展知识(优缺点)
优点
- 更高的日志打印峰值吞吐量。您的应用程序可以以6 - 68倍于同步日志记录器的速度记录消息。
- 降低日志响应时间延迟。响应时间延迟是在给定工作负载下调用Logger.log返回所需的时间。异步日志记录器的延迟始终低于同步日志记录器,甚至低于基于队列的异步appenders
缺点
- 因为异步打印日志,已经切换到 其他线程打印.所以 如果出错了,原来的业务线程感知不到,所以如果用日志做业务流程处理的,比如审计,最好采用同步日志
- 如果服务器是单核心的,那么不要采用异步日志,不能增加性能.线程切换,可能导致性能下降.
- 如果应用程序记录消息的持续速率快于底层appender的最大持续吞吐量,则队列将满,应用程序将以最慢的appender的速度记录日志。如果发生这种情况,请考虑选择一个更快的appender,或者减少日志记录。如果这两个选项都不行,那么您可以通过同步日志获得更好的吞吐量和更少的延迟峰值。
参考
https://zhuanlan.zhihu.com/p/105428561
log4j2 异步日志使用方式
1. 全部日志采用异步模式
如上次增加 log4j2.component.properties 配置异步 AsyncLoggerContextSelector, 然后 log4j2.xml 和同步的配置一样,不需要再使用 AsAsyncLogger 或 AsyncRoot。
2. 混合同步异步模式
不需要配置 AsyncLoggerContextSelector,直接在 log4j2.xml 混合 Logger 和 AsAsyncLogger。
Random Access File Appender
RollingRandomAccessFile 在异步日志使用中,性能要好与 RollingFile 。使用方式和RollingFile差不多 ,除了始终缓冲的默认缓冲区大小为256 * 1024字节(可以在启动时候指定更改,但不会动态变化了)。
参考资料
https://springframework.guru/asynchronous-logging-with-log4j-2/

本文详细介绍了如何在Spring Boot应用中使用log4j2实现异步日志,包括排除默认logback、配置异步日志系统属性、创建多个日志文件及配置过滤规则。同时探讨了异步日志的优势和可能的局限性。
1797

被折叠的 条评论
为什么被折叠?



