返回

SpringBoot整合log4j---踩过的大坑

后端

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应用程序默认情况下使用ConsoleAppenderPatternLayout来记录日志,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-corelog4j-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>

更多丰富详尽的内容请持续关注,为您解读更多技术要点。