日志记录
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 覆盖配置文件路径可加 |