目录
Maven依赖
参考:
https://docs.spring.io/spring-boot/docs/2.7.14/reference/htmlsingle/#howto.logging.log4j
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<exclusions>
<!-- 排除springboot默认的logback
从spring-boot-starter中排除, 而不是spring-boot-starter-xxx,避免要排除多次 -->
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- 引入log4j2依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
log4j2.xml配置注释
<?xml version="1.0" encoding="UTF-8"?>
<!-- Configuration后面的status,这个用于设置log4j2自身内部的信息输出,可以不设置,
当设置成trace时,可以看到log4j2内部各种详细输出
-->
<!-- monitorInterval:自动检测配置文件是否修改和并重新加载,单位:秒,最低5s, 注意:在编译器环境下需要修改 target/classes 目录下的文件才有效果, 而不是src/main/resources-->
<Configuration status="info" monitorInterval="5">
<!-- 日志级别以及优先级排序: 低 ALL < TRACE < DEBUG < INFO < WARN < ERROR < FATAL < OFF 高 -->
<!-- 变量配置 -->
<Properties>
<!--
格式化输出:
%date{yyyy-MM-dd HH:mm:ss.SSS}: 简写为%d 日期 2023-08-12 15:04:30,123
%thread: %t 线程名, main
%-5level:%p 日志级别,从左往右至少显示5个字符宽度,不足补空格 INFO
%msg:%m 日志消息 info msg
%n: 换行符
{cyan}: 蓝绿色(青色)
%logger{36}: %c 表示 Logger 名字最长36个字符
%C: 类路径 com.qq.demolog4j2.TestLog4j2
%M: 方法名 main
%F: 类名 TestLog4j2.java
%L: 行号 12
%l: 日志位置, 相当于 %C.%M(%F.%L) com.qq.demolog4j2.TestLog4j2.main(TestLog4j2.java:16)
-->
<property name="NORMAL_PATTERN" value="%date{yyyy-MM-dd HH:mm:ss.SSS} %highlight{%-5level} [%thread] %style{%logger{72}}{cyan} : %msg%n" />
<property name="SIMPLE_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss} %highlight{%-5p} [%t] %style{%l}{cyan} : %m%n" />
<property name="baseDir" value="./logs" />
<property name="FILE_NAME_IP" value="192.168.10.20" />
</Properties>
<Appenders>
<console name="Console" target="SYSTEM_OUT">
<!--输出日志的格式-->
<PatternLayout pattern="${SIMPLE_PATTERN}" disableAnsi="false" noConsoleNoAnsi="false"/>
<!--控制台只输出level及其以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->
<ThresholdFilter level="debug" onMatch="ACCEPT" onMismatch="DENY"/>
</console>
<!--
这个会打印出所有的info及以上级别的信息,达到滚动条件后,日志会自动按filePattern格式保存并压缩,日期精确到分钟
基于文件大小和时间的滚动策略
-->
<RollingFile name="RollingFileInfo" fileName="${baseDir}/info.log"
filePattern="${baseDir}/$${date:yyyy-MM}/${FILE_NAME_IP}-INFO-%d{yyyy-MM-dd-HH-mm}_%i.log.gz">
<!--只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->
<ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
<PatternLayout pattern="${SIMPLE_PATTERN}"/>
<Policies>
<!-- 满足任意条件就开始滚动 -->
<!--interval属性用来指定多久滚动一次,默认是1, 单位根据filePattern中日期的最小单位来-->
<TimeBasedTriggeringPolicy interval="1"/>
<!-- 日志超过20MB就滚动 -->
<SizeBasedTriggeringPolicy size="20KB"/>
</Policies>
<!-- DefaultRolloverStrategy属性如不设置,则默认为最多同一文件夹下7个文件开始覆盖 -->
<DefaultRolloverStrategy max="5"/>
</RollingFile>
<!-- 这个会打印出所有的warn及以上级别的信息,filePattern的日期精确到小时
基于文件大小的策略-->
<RollingFile name="RollingFileWarn" fileName="${baseDir}/warn.log"
filePattern="${baseDir}/${FILE_NAME_IP}-WARN-%d{yyyy-MM-dd-HH}.log.gz">
<!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->
<ThresholdFilter level="warn" onMatch="ACCEPT" onMismatch="DENY"/>
<PatternLayout pattern="${NORMAL_PATTERN}"/>
<Policies>
<SizeBasedTriggeringPolicy size="20MB"/>
</Policies>
<DefaultRolloverStrategy max="15"/>
</RollingFile>
<!-- 这个会打印出所有的error及以上级别的信息,filePattern的日期精确到天
基于时间间隔的策略-->
<RollingFile name="RollingFileError" fileName="${baseDir}/error.log"
filePattern="${baseDir}/${FILE_NAME_IP}-ERROR-%d{yyyy-MM-dd}.log">
<!--控制台只输出error及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->
<ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/>
<PatternLayout pattern="${NORMAL_PATTERN}"/>
<Policies>
<TimeBasedTriggeringPolicy interval="1"/>
</Policies>
<DefaultRolloverStrategy>
<!-- 日志只保留7d,超过自动删除 -->
<Delete basePath="${baseDir}" maxDepth="1">
<IfFileName glob="*-ERROR-*.log" />
<!-- age支持 PnDTnHnMnS 格式,
参考 org.apache.logging.log4j.core.appender.rolling.action.Duration.parse()方法的注释 -->
<IfLastModified age="7d" />
</Delete>
</DefaultRolloverStrategy>
</RollingFile>
</Appenders>
<!--Logger节点用来单独指定日志的形式,比如要为指定包下的class指定不同的日志级别等。-->
<!--然后定义loggers,只有定义了logger并引入的appender,appender才会生效-->
<Loggers>
<!--过滤掉spring和mybatis中的DEBUG信息-->
<Logger name="org.mybatis" level="info" additivity="false">
<AppenderRef ref="Console"/>
</Logger>
<!--若是additivity设为false,则 子Logger 只会在自己的appender里输出,而不会在 父Logger 的appender里输出。-->
<Logger name="org.springframework" level="info" additivity="false">
<AppenderRef ref="Console"/>
</Logger>
<Root level="debug">
<!-- 配置了多个appender,就会输出到多个appender中,即同一条日志会在打印多次 -->
<appender-ref ref="Console"/>
<appender-ref ref="RollingFileInfo"/>
<appender-ref ref="RollingFileWarn"/>
<appender-ref ref="RollingFileError"/>
</Root>
</Loggers>
</Configuration>
测试
@RestController
@Log4j2
public class TestController {
@RequestMapping("/test")
public String test() {
new Thread(() -> {
while (true) {
log4j2();
try {
Thread.sleep(200L);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();
return "done";
}
private void log4j2() {
log.trace("trace msg");
log.debug("debug msg");
log.info("info msg");
log.warn("warn msg");
log.error("error msg");
log.fatal("fatal msg");
}
}
参考
引入log4j2依赖
https://docs.spring.io/spring-boot/docs/2.7.14/reference/htmlsingle/#howto.logging.log4j
自动重新配置 monitorInterval
https://logging.apache.org/log4j/2.x/manual/configuration.html#automatic-reconfiguration
Appenders
https://logging.apache.org/log4j/2.x/manual/appenders.html
自动配置 文件加载顺序
https://logging.apache.org/log4j/2.x/manual/configuration.html#automatic-configuration
pattern-layout
https://logging.apache.org/log4j/2.x/manual/layouts.html#pattern-layout
SpringBoot整合log4j2进行日志配置及防坑指南
https://www.cnblogs.com/cndarren/p/12021596.html
SpringBoot—整合log4j2入门和log4j2.xml配置详解
https://www.cnblogs.com/exmyth/p/15355504.html