83. Logging
除了通常由 Spring Framework 的spring-jcl
模块提供的 Commons Logging API 以外,Spring Boot 没有强制性的日志记录依赖项。要使用Logback,您需要在 Classpath 中包括它和spring-jcl
。最简单的方法是通过启动器,它们都取决于spring-boot-starter-logging
。对于 Web 应用程序,您只需要spring-boot-starter-web
,因为它暂时取决于日志记录启动器。如果使用 Maven,则以下依赖项会为您添加日志记录:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
Spring Boot 具有LoggingSystem
抽象,该抽象试图基于 Classpath 的内容配置日志记录。如果可以使用 Logback,则它是首选。
如果您唯一需要对日志记录进行的更改是设置各种 Logger 的级别,则可以使用“ logging.level”前缀在application.properties
中进行设置,如以下示例所示:
logging.level.org.springframework.web=DEBUG
logging.level.org.hibernate=ERROR
您还可以使用“ logging.file”设置日志的文件位置(控制台除外)。
要配置日志记录系统的更细粒度的设置,您需要使用所讨论的LoggingSystem
支持的本机配置格式。默认情况下,Spring Boot 从系统的默认位置(例如classpath:logback.xml
用于 Logback)获取本地配置,但是您可以使用“ logging.config”属性来设置配置文件的位置。
83.1 配置日志记录的日志回传
如果将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
,您会发现它使用了一些有用的 System 属性,而LoggingSystem
会为您创建这些属性:
-
${PID}
:当前进程 ID。 -
${LOG_FILE}
:是否在 Boot 的外部配置中设置了logging.file
。 -
${LOG_PATH}
:是否在 Boot 的外部配置中设置了logging.path
(表示要存放日志文件的目录)。 -
${LOG_EXCEPTION_CONVERSION_WORD}
:是否在 Boot 的外部配置中设置了logging.exception-conversion-word
。
通过使用自定义的 Logback 转换器,Spring Boot 还可以在控制台上提供一些不错的 ANSI 颜色终端输出(但不在日志文件中)。有关详细信息,请参见默认的base.xml
配置。
如果 Groovy 在 Classpath 上,那么您也应该能够使用logback.groovy
配置 Logback。如果存在,则优先考虑此设置。
83.1.1 为仅文件输出配置 Logback
如果要禁用控制台日志记录并仅将输出写入文件,则需要一个自定义logback-spring.xml
,它导入file-appender.xml
但不导入console-appender.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
83.2 配置 Log4j 进行日志记录
如果 Spring Boot 在 Classpath 中,则支持Log4j 2进行日志记录配置。如果使用 Starter 程序来组装依赖项,则必须排除 Logback,然后改为包括 log4j 2.如果您不使用启动器,则除了 Log4j 2 外,还需要(至少)提供spring-jcl
。
最简单的方法可能是通过启动程序,即使它需要对排除对象进行微调。以下示例显示了如何在 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>
以下示例显示了在 Gradle 中设置启动器的一种方法:
dependencies {
compile 'org.springframework.boot:spring-boot-starter-web'
compile 'org.springframework.boot:spring-boot-starter-log4j2'
}
configurations {
all {
exclude group: 'org.springframework.boot', module: 'spring-boot-starter-logging'
}
}
Note
Log4j Starter 人员将依赖关系集中在一起,以满足常见的日志记录要求(例如让 Tomcat 使用java.util.logging
,但使用 Log4j 2 配置输出)。有关详细信息,请参见Actuator Log4j 2示例,并查看实际效果。
Note
为了确保将使用java.util.logging
执行的调试日志记录路由到 Log4j 2 中,可以通过将java.util.logging.manager
系统属性设置为org.apache.logging.log4j.jul.LogManager
来配置其JDK 记录适配器。
83.2.1 使用 YAML 或 JSON 配置 Log4j 2
除了默认的 XML 配置格式外,Log4j 2 还支持 YAML 和 JSON 配置文件。要将 Log4j 2 配置为使用备用配置文件格式,请将适当的依赖项添加到 Classpath 中,并为您的配置文件命名以匹配您选择的文件格式,如以下示例所示:
Format | Dependencies | File names |
---|---|---|
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 |