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 日志不会输出。