SpringBoot整合log4j---踩过的大坑
2024-02-13 04:21:17
SpringBoot整合Log4j过程踩过的坑
修改了配置文件后发现日志还是老样子
很多人可能都会遇到过这个问题,改完配置文件之后发现项目还是输出着跟之前一样的日志。还以为是配置改错了,或者配置文件不生效,其实spring boot有很多种日志方式,包括SLF4J,Log4J,Log4J2,Common Logging等。虽然SLF4J和其他日志框架可以兼容,但是这里SLF4J只是作为一个日志门面,具体的日志输出还是通过其他日志框架来实现的。
若是想要改成自己配置的日志框架,需要在项目的pom文件中加入如下依赖,或者修改默认的版本
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j</artifactId>
</dependency>
默认Spring Boot使用的是logging.level.*
来配置日志级别,Spring Boot会在收到这个属性之后,再将它映射成Log4j2的日志级别。我们一般会使用如下的配置
# 设置日志记录级别
logging.level.root=INFO
配置完之后可能发现并没有任何变化,那是因为SpringBoot还提供一种统一的日志输出,这一部分的日志不能被直接改掉。SpringBoot在这个环节中做了一个bug,可以看到SpringBoot关于配置文件中logging.level.*
的配置信息使用的是Properties类型,而实际在代码中定义的是System.getProperties()
,这就意味着配置中改动这些参数并不会对应用产生任何影响。
解决方法就是删除SpringBoot的自动配置,通过@SpringBootApplication
注解将exclude
参数设为LoggingAutoConfiguration.class
。
@SpringBootApplication(exclude = { LoggingAutoConfiguration.class })
public class SpringbootLog4jApplication {
public static void main(String[] args) {
SpringApplication.run(SpringbootLog4jApplication.class, args);
}
}
自定义日志打印格式无效,默认输出的日志带有类路径和方法名
遇到这个问题也是在学习的过程中花了不少时间去理解。Spring Boot应用程序默认情况下使用ConsoleAppender
和PatternLayout
来记录日志,PatternLayout
的默认格式是%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
,也就是说输出的日志会带有类路径和方法名。
若是想要使用自定义日志格式,只需要在log4j2.xml文件中配置PatternLayout组件,并使用%m
作为占位符。
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %m%n" />
</Console>
</Appenders>
<Loggers>
<Root level="info">
<AppenderRef ref="Console" />
</Root>
</Loggers>
</Configuration>
日志文件中多出了很多空行和红色的日志
一般是由于版本冲突导致的。可以在maven的仓库中查看有没有重复的组件,例如我开发的时候遇到过版本冲突是由于同时存在log4j-core
和log4j-api
。
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.16.0</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.14.1</version>
</dependency>
解决方法就是先将两个依赖删除,然后清空maven的仓库,最后重新下载依赖。
mvn clean install
日志文件无限制的创建,把整个磁盘占满
Spring Boot默认的日志文件在运行过程中是会不断创建的,这就会造成磁盘被占满。若是想改成自定义日志滚动策略,只需修改log4j2.xml文件即可。例如这里将RollingFileAppender的策略改成按天滚动,且最多保存3天的日志文件。
<Appenders>
<RollingFile name="RollingFile" fileName="log/application.log" filePattern="log/application-%d{yyyy-MM-dd}.log" ignoreExceptions="false">
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %m%n" />
<Policies>
<TimeBasedTriggeringPolicy interval="1" modulate="true" />
<SizeBasedTriggeringPolicy size="100MB" />
</Policies>
<DefaultRolloverStrategy max="3" />
</RollingFile>
</Appenders>
更多丰富详尽的内容请持续关注,为您解读更多技术要点。