日志

Spring Boot 没有强制性的日志依赖,除了 Commons Logging API,它通常由 Spring Framework 的 spring-jcl 模块提供。要使用 Logback,你需要在类路径中包含它和 spring-jcl。推荐的方法是通过 Starter,所有 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 抽象,它会尝试根据类路径的内容配置日志。如果 Logback 可用,它将是首选。

如果你只需更改日志记录器级别,可以使用 "logging.level" 前缀在 application.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 配置,这些配置可以 包含 在你自己的配置中。这些包含文件旨在重新应用一些常见的 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_PATTERNROLLING_FILE_NAME_PATTERNRollingFileAppender

  • structured-file-appender.xml - 使用 ROLLING_FILE_NAME_PATTERN,并在 FILE_LOG_STRUCTURED_FORMAT 中进行结构化日志记录,添加一个 RollingFileAppender

此外,还提供了一个传统的 base.xml 文件,用于与早期版本的 Spring Boot 兼容。

一个典型的自定义 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>

你还需要将 logging.file.name 添加到你的 application.propertiesapplication.yaml 中,如下例所示

  • 属性

  • YAML

logging.file.name=myapplication.log
logging:
  file:
    name: "myapplication.log"

配置 Log4j 用于日志记录

如果 Log4j 2 在类路径中,Spring Boot 支持使用 Log4j 2 进行日志配置。如果你使用 Starter 来组装依赖,你需要排除 Logback,然后包含 Log4j 2。如果你不使用 Starter,除了 Log4j 2 之外,你至少还需要提供 spring-jcl

推荐的方法是通过 Starter,尽管这需要一些调整。以下示例展示了如何在 Maven 中设置 Starter

<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 提供了几种不同的方式来设置 Starter。一种方式是使用模块替换。为此,声明对 Log4j 2 Starter 的依赖,并告诉 Gradle 将所有默认日志 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 Starter 将常见日志记录需求(例如让 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

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

使用组合配置配置 Log4j 2

Log4j 2 支持将多个配置文件组合成一个组合配置。要在 Spring Boot 中使用此功能,请通过 logging.log4j2.config.override 配置一个或多个次级配置文件的位置。次级配置文件将与主配置合并,无论主配置源自 Spring Boot 的默认配置、标准位置(例如 log4j.xml)还是通过 logging.config 属性配置的位置。