日志记录
Spring Boot 没有强制性的日志依赖,除了 Commons Logging API,它通常由 Spring Framework 的 spring-jcl
模块提供。
要使用 Logback,您需要在类路径中包含它和 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
抽象,它尝试根据类路径的内容配置日志记录。
如果 Logback 可用,它是首选。
如果您只需要更改日志记录的内容是设置各种记录器的级别,您可以在 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
文件供 logback 查找。
如果您想使用 Spring Boot 的 Logback 扩展,也可以使用 logback-spring.xml
。
提示:Logback 文档有一个 专门的部分详细介绍了配置。
Spring Boot 提供了许多 logback 配置,可以在您自己的配置中 include
。
这些包含旨在允许重新应用某些常见的 Spring Boot 约定。
以下文件在 org/springframework/boot/logging/logback/
下提供:
-
defaults.xml
- 提供转换规则、模式属性和通用记录器配置。 -
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
- 使用ROLLING_FILE_NAME_PATTERN
添加RollingFileAppender
,并在FILE_LOG_STRUCTURED_FORMAT
中使用结构化日志记录。
此外,为了与早期版本的 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
。
如果类路径上有 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 进行日志记录
如果类路径上有 Log4j 2,Spring Boot 支持使用它进行日志配置。
如果您使用启动器来组装依赖项,您必须排除 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 提供了几种设置启动器的方法。 一种方法是使用 模块替换。 为此,声明对 Log4j 2 启动器的依赖,并告诉 Gradle 任何默认日志启动器的出现都应该被 Log4j 2 启动器替换,如下例所示:
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 启动器收集了常见日志记录需求的依赖项(例如,让 Tomcat 使用 java.util.logging
但使用 Log4j 2 配置输出)。
注意:要确保使用 java.util.logging
执行的调试日志记录被路由到 Log4j 2,请通过将 java.util.logging.manager
系统属性设置为 org.apache.logging.log4j.jul.LogManager
来配置其 JDK 日志适配器。
使用 YAML 或 JSON 配置 Log4j 2
除了其默认的 XML 配置格式外,Log4j 2 还支持 YAML 和 JSON 配置文件。 要配置 Log4j 2 使用替代配置文件格式,请将适当的依赖项添加到类路径,并将配置文件命名为与您选择的文件格式匹配,如下例所示:
格式 | 依赖项 | 文件名 |
---|---|---|
YAML |
|
|
JSON |
|
|