Spring Boot除了commons-logging
API外没有其他强制性的日志依赖,你有很多可选的日志实现。想要使用Logback,你需要包含它及jcl-over-slf4j
(它实现了Commons Logging API)。最简单的方式是通过依赖spring-boot-starter-logging
的starters。对于一个web应用程序,你只需添加spring-boot-starter-web
依赖,因为它依赖于logging starter。例如,使用Maven:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
Spring Boot有一个LoggingSystem
抽象,用于尝试通过classpath上下文配置日志系统。如果Logback可用,则首选它。如果你唯一需要做的就是设置不同日志级别,那可以通过在application.properties
中使用logging.level
前缀实现,比如:
logging.level.org.springframework.web=DEBUG
logging.level.org.hibernate=ERROR
你也可以使用logging.file
设置日志文件的位置(除控制台之外,默认会输出到控制台)。
想要对日志系统进行更细粒度的配置,你需要使用LoggingSystem
支持的原生配置格式。默认情况下,Spring Boot从系统的默认位置加载原生配置(比如对于Logback为classpath:logback.xml
),但你可以使用logging.config
属性设置配置文件的位置。
如果你将logback.xml
放到classpath根目录下,那它将会被从这加载(或logback-spring.xml
充分利用Boot提供的模板特性)。Spring Boot提供一个默认的基本配置,如果你只是设置日志级别,那你可以包含它,比如:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<include resource="org/springframework/boot/logging/logback/base.xml"/>
<logger name="org.springframework.web" level="DEBUG"/>
</configuration>
如果查看spring-boot jar中的base.xml
,你将会看到LoggingSystem
为你创建的很多有用的系统属性,比如:
- ${PID}
,当前进程id。
- ${LOG_FILE}
,如果在Boot外部配置中设置了logging.file
。
- ${LOG_PATH}
,如果设置了logging.path
(表示日志文件产生的目录)。
- ${LOG_EXCEPTION_CONVERSION_WORD}
,如果在Boot外部配置中设置了logging.exception-conversion-word
。
Spring Boot也提供使用自定义的Logback转换器在控制台上输出一些漂亮的彩色ANSI日志信息(不是日志文件),具体参考默认的base.xml
配置。
如果Groovy在classpath下,你也可以使用logback.groovy
配置Logback。
如果想禁用控制台日志记录,只将输出写入文件中,你需要一个只导入file-appender.xml
而不是console-appender.xml
的自定义logback-spring.xml
:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<include resource="org/springframework/boot/logging/logback/defaults.xml" />
<property name="LOG_FILE" value="${LOG_FILE:-${LOG_PATH:-${LOG_TEMP:-${java.io.tmpdir:-/tmp}}/}spring.log}"/>
<include resource="org/springframework/boot/logging/logback/file-appender.xml" />
<root level="INFO">
<appender-ref ref="FILE" />
</root>
</configuration>
你还需要将logging.file
添加到application.properties
:
logging.file=myapplication.log
如果Log4j 2出现在classpath下,Spring Boot会将其作为日志配置。如果你正在使用starters进行依赖装配,这意味着你需要排除Logback,然后包含log4j 2。如果不使用starters,除了添加Log4j 2,你还需要提供jcl-over-slf4j
依赖(至少)。
最简单的方式可能就是通过starters,尽管它需要排除一些依赖,比如,在Maven中:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<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 starters会收集好依赖以满足普通日志记录的需求(比如,Tomcat中使用java.util.logging
,但使用Log4j 2作为输出),具体查看Actuator Log4j 2的示例,了解如何将它用于实战。
除了它的默认XML配置格式,Log4j 2也支持YAML和JSON配置文件。想使用其他配置文件格式配置Log4j 2,你需要添加合适的依赖到classpath,并以匹配所选格式的方式命名配置文件:
格式 | 依赖 | 文件名 |
---|---|---|
YAML | com.fasterxml.jackson.core:jackson-databind com.fasterxml.jackson.dataformat:jackson-dataformat-yaml |
log4j2.yaml log4j2.yml |
JSON | com.fasterxml.jackson.core:jackson-databind |
log4j2.json log4j2.jsn |