日志记录

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_PATTERNROLLING_FILE_NAME_PATTERN 及相关设置添加 RollingFileAppender

  • structured-file-appender.xml - 使用结构化日志格式 FILE_LOG_STRUCTURED_FORMATROLLING_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.propertiesapplication.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

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 属性指定。

Log4j2 覆盖配置文件路径可加 optional: 前缀。 例如,optional:classpath:log4j2-override.xml 表示仅在资源存在时才加载 log4j2-override.xml