日志记录
Spring Boot 没有强制性的日志依赖,除了 Commons Logging API,这通常由 Spring Framework 的 spring-jcl 模块提供。
要使用 Logback,你需要在 classpath 中包含它和 spring-jcl。
推荐的方式是通过 starters,这些 starter 都依赖于 spring-boot-starter-logging。
对于 Web 应用,只需引入 spring-boot-starter-web,因为它会传递性依赖日志 starter。
如果你使用 Maven,以下依赖会自动为你添加日志支持:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
Spring Boot 提供了 LoggingSystem 抽象,根据 classpath 内容自动配置日志。
如果 Logback 可用,则优先选择 Logback。
如果你只需要调整各个 logger 的日志级别,可以在 application.properties 中使用 "logging.level" 前缀,如下例所示:
-
Properties
-
YAML
logging.level.org.springframework.web=debug
logging.level.org.hibernate=error
logging:
level:
org.springframework.web: "debug"
org.hibernate: "error"
你还可以通过 logging.file.name 设置日志写入的文件位置(除了控制台输出外)。
如需更细粒度地配置日志系统,需要使用 LoggingSystem 支持的原生配置格式。
默认情况下,Spring Boot 会从系统的默认位置加载原生配置(如 Logback 的 classpath:logback.xml),但你也可以通过 logging.config 属性指定配置文件位置。
配置 Logback 日志
如果你需要对 logback 进行超出 application.properties 能实现的自定义,则需要添加标准的 logback 配置文件。
你可以将 logback.xml 文件放在 classpath 根目录,logback 会自动加载。
如果你想使用 Spring Boot Logback 扩展,也可以使用 logback-spring.xml。
| Logback 文档有一个 专门的配置章节,详细介绍了相关内容。 |
Spring Boot 提供了多个可在你自定义配置中 include 的 logback 配置文件。
这些 include 旨在让常见的 Spring Boot 约定能够被复用。
以下文件位于 org/springframework/boot/logging/logback/ 路径下:
-
defaults.xml- 提供转换规则、模式属性和常用 logger 配置。 -
console-appender.xml- 使用CONSOLE_LOG_PATTERN添加ConsoleAppender。 -
structured-console-appender.xml- 使用结构化日志格式CONSOLE_LOG_STRUCTURED_FORMAT添加ConsoleAppender。 -
file-appender.xml- 使用FILE_LOG_PATTERN和ROLLING_FILE_NAME_PATTERN及相关设置添加RollingFileAppender。 -
structured-file-appender.xml- 使用结构化日志格式FILE_LOG_STRUCTURED_FORMAT和ROLLING_FILE_NAME_PATTERN添加RollingFileAppender。
此外,还提供了一个兼容早期 Spring Boot 版本的 base.xml 文件。
一个典型的自定义 logback.xml 文件如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<include resource="org/springframework/boot/logging/logback/defaults.xml"/>
<include resource="org/springframework/boot/logging/logback/console-appender.xml" />
<root level="INFO">
<appender-ref ref="CONSOLE" />
</root>
<logger name="org.springframework.web" level="DEBUG"/>
</configuration>
你的 logback 配置文件还可以使用 LoggingSystem 自动创建的系统属性:
-
${PID}:当前进程 ID。 -
${LOG_FILE}:是否在 Boot 外部配置中设置了logging.file.name。 -
${LOG_PATH}:是否在 Boot 外部配置中设置了logging.file.path(表示日志文件存放目录)。 -
${LOG_EXCEPTION_CONVERSION_WORD}:是否在 Boot 外部配置中设置了logging.exception-conversion-word。 -
${ROLLING_FILE_NAME_PATTERN}:是否在 Boot 外部配置中设置了logging.pattern.rolling-file-name。
Spring Boot 还通过自定义 Logback 转换器,在控制台(但不是日志文件)中提供了漂亮的 ANSI 彩色输出。
可参考 defaults.xml 配置中的 CONSOLE_LOG_PATTERN 示例。
如果 classpath 中有 Groovy,也可以用 logback.groovy 配置 Logback。
如果存在该文件,则优先使用。
Groovy 配置不支持 Spring 扩展。
任何 logback-spring.groovy 文件都不会被检测到。
|
配置 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>
你还需要在 application.properties 或 application.yaml 中添加 logging.file.name,如下所示:
-
Properties
-
YAML
logging.file.name=myapplication.log
logging:
file:
name: "myapplication.log"
配置 Log4j 日志
Spring Boot 支持 Log4j 2 日志配置,只要它在 classpath 中。
如果你用 starters 管理依赖,需要排除 Logback 并引入 Log4j 2。
如果不用 starters,除了 Log4j 2 还需至少引入 spring-jcl。
推荐路径依然是通过 starters,虽然需要一些调整。 以下示例展示了如何在 Maven 中配置 starters:
<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 提供了几种方式来配置 starters。 其中一种是使用 module replacement。 声明依赖 Log4j 2 starter,并指定将默认日志 starter 替换为 Log4j 2 starter,如下例所示:
dependencies {
implementation "org.springframework.boot:spring-boot-starter-log4j2"
modules {
module("org.springframework.boot:spring-boot-starter-logging") {
replacedBy("org.springframework.boot:spring-boot-starter-log4j2", "Use Log4j2 instead of Logback")
}
}
}
Log4j starters 会聚合常见日志需求的依赖(比如让 Tomcat 使用 java.util.logging,但用 Log4j 2 配置输出)。
|
若要确保通过 java.util.logging 输出的 debug 日志能路由到 Log4j 2,请通过设置 java.util.logging.manager 系统属性为 org.apache.logging.log4j.jul.LogManager,配置其 JDK logging adapter。
|
使用 YAML 或 JSON 配置 Log4j 2
除了默认的 XML 配置格式,Log4j 2 还支持 YAML 和 JSON 配置文件。 要让 Log4j 2 使用其他配置文件格式,只需将相关依赖加入 classpath,并将配置文件命名为对应格式,如下表所示:
| 格式 | 依赖 | 文件名 |
|---|---|---|
YAML |
|
|
JSON |
|
|
使用复合配置配置 Log4j 2
Log4j 2 支持将多个配置文件合并为一个复合配置。
在 Spring Boot 中使用该特性时,可通过 logging.log4j2.config.override 配置一个或多个次级配置文件的位置。
这些次级配置文件会与主配置合并,无论主配置来源于 Spring Boot 默认、log4j.xml 等标准位置,还是通过 logging.config 属性指定。
|
Log4j2 覆盖配置文件路径可加 |