目录

  • Maven依赖
  • log4j2.xml配置注释
  • 测试
  • 参考

Maven依赖

<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");
	}
}