Spring Boot 默认使用 Logback,一般情况下已经够用。如果要换成 Log4j,需要排除默认日志依赖,再引入对应的 Starter。这里有个版本区别:Log4j 1 和 Log4j 2 的依赖、配置文件都不一样,升级 Spring Boot 时容易碰到。

原来的 Log4j 配置

Spring Boot 1.3.x 中,可以先排除 spring-boot-starter-logging:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter</artifactId>
    <exclusions>
        <exclusion>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-logging</artifactId>
        </exclusion>
    </exclusions>
</dependency>

再引入 Log4j 的 Starter,版本由项目的 Spring Boot 依赖管理提供:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-log4j</artifactId>
</dependency>

在 src/main/resources 下创建 log4j.properties:

log4j.rootLogger=INFO,stdout

log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss:SSS} %p [%c] %m%n

配置完毕,启动项目,控制台会按这个格式输出 INFO 及以上级别的日志。

升级后改用 Log4j2

Spring Boot 从 1.4 起移除了 Log4j 1 的支持,spring-boot-starter-log4j 不能再按上面的方式使用。1.4、1.5 项目改用 spring-boot-starter-log4j2,同时保留对默认日志依赖的排除:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter</artifactId>
    <exclusions>
        <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-log4j2</artifactId>
</dependency>

这里是替换前面的 Log4j Starter,不是把两个都加进来。如果项目通过 spring-boot-starter-web 等依赖引入默认日志,也要检查对应的依赖路径:

mvn dependency:tree

排除项只对所在的依赖路径生效。如果其他路径仍然引入 spring-boot-starter-logging,也需要在相应依赖下排除。

启动时如果出现下面的提示:

SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation

说明 SLF4J 没有找到日志实现的绑定,日志会被丢弃。先检查运行时依赖中是否包含 Log4j2 Starter 带入的 log4j-slf4j-impl、log4j-api 和 log4j-core。这个提示本身不能说明 Spring Boot 是哪个版本,也不是修改日志级别就能解决的。

配置文件也要改

换了依赖后,原来的 log4j.properties 不能直接使用,只改名为 log4j2.properties 也不行。

Log4j 2 从 2.4 起支持 properties 配置,但语法与 Log4j 1 不兼容。这里改用 XML,在 src/main/resources 下创建 log4j2.xml:

<?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} %p [%c] %m%n"/>
        </Console>
    </Appenders>
    <Loggers>
        <Root level="info">
            <AppenderRef ref="Console"/>
        </Root>
    </Loggers>
</Configuration>

Root 的 level="info" 控制应用日志级别;status="WARN" 控制 Log4j2 自身的诊断信息,不是应用日志级别。

重新启动项目,控制台应按配置的时间、级别、Logger 名称和消息格式输出日志,DEBUG 日志不会输出。

最后修改:2017 年 08 月 25 日
如果觉得我的文章对你有用,请随意赞赏