日志记录

Spring Boot 除了 Commons Logging API 外,没有强制的日志依赖项,而 Commons Logging API 通常由 Spring Framework 的 spring-jcl 模块提供。 要使用 Logback,您需要将其和 spring-jcl 添加到类路径中。 推荐的做法是通过 Starter 依赖来实现,因为所有 Starter 都依赖于 spring-boot-starter-logging。 对于 Web 应用程序,您只需引入 spring-boot-starter-web,因为它会通过传递依赖自动引入日志 Starter。 如果您使用 Maven,以下依赖项将为您添加日志功能:spring-doc.cadn.net.cn

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-web</artifactId>
</dependency>

Spring Boot 拥有一个 LoggingSystem 抽象,它尝试根据类路径的内容配置日志记录。 如果可用,Logback 是首选。spring-doc.cadn.net.cn

如果要对日志记录所做的唯一更改是设置各个记录器的日志级别,那么你可以通过在 application.properties 文件中使用 "logging.level" 前缀来实现,如下例所示:spring-doc.cadn.net.cn

logging.level.org.springframework.web=debug
logging.level.org.hibernate=error
logging:
  level:
    org.springframework.web: "debug"
    org.hibernate: "error"

你也可以通过使用 logging.file.name 来设置日志写入的文件位置(除了控制台之外)。spring-doc.cadn.net.cn

要配置日志系统的更细粒度设置,您需要使用相关LoggingSystem所支持的原生配置格式。 默认情况下,Spring Boot 会从系统的默认位置(例如 Logback 的classpath:logback.xml)加载原生配置,但您可以通过logging.config属性来设置配置文件的位置。spring-doc.cadn.net.cn

配置 Logback 以进行日志记录

如果你需要对 Logback 进行超出 application.properties 所能实现范围的自定义配置,就需要添加一个标准的 Logback 配置文件。 你可以将一个 logback.xml 文件添加到类路径的根目录下,以便 Logback 能够找到它。 如果你希望使用 Spring Boot 的Logback 扩展功能,也可以使用 ../reference/features/logging.html#features.logging.logback-extensionsspring-doc.cadn.net.cn

Logback 文档中有一个专门的章节详细介绍了配置

Spring Boot 提供了多个 Logback 配置,这些配置可以被 included(包含)到您自己的配置中。 这些包含项旨在允许重新应用某些常见的 Spring Boot 约定。spring-doc.cadn.net.cn

以下文件位于 org/springframework/boot/logging/logback/ 目录下:spring-doc.cadn.net.cn

此外,还提供了一个旧版的 base.xml 文件,以兼容早期版本的 Spring Boot。spring-doc.cadn.net.cn

一个典型的自定义 logback.xml 文件大致如下所示:spring-doc.cadn.net.cn

<?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 为您负责创建的系统属性:spring-doc.cadn.net.cn

  • ${PID}:当前进程 ID。spring-doc.cadn.net.cn

  • ${LOG_FILE}:是否在 Boot 的外部配置中设置了 logging.file.namespring-doc.cadn.net.cn

  • ${LOG_PATH}:表示是否在 Boot 的外部配置中设置了 logging.file.path(用于指定日志文件所在目录)。spring-doc.cadn.net.cn

  • ${LOG_EXCEPTION_CONVERSION_WORD}:是否在 Boot 的外部配置中设置了 logging.exception-conversion-wordspring-doc.cadn.net.cn

  • ${ROLLING_FILE_NAME_PATTERN}:是否在 Boot 的外部配置中设置了 logging.pattern.rolling-file-namespring-doc.cadn.net.cn

Spring Boot 还通过使用自定义的 Logback 转换器,在控制台(但不会在日志文件中)提供了一些漂亮的 ANSI 彩色终端输出。 有关示例,请参见 CONSOLE_LOG_PATTERN 配置文件中的 defaults.xmlspring-doc.cadn.net.cn

如果类路径中包含 Groovy,你也可以使用 logback.groovy 来配置 Logback。 如果该文件存在,此设置将被优先采用。spring-doc.cadn.net.cn

Groovy 配置不支持 Spring 扩展。 任何 logback-spring.groovy 文件都不会被检测到。

配置 Logback 仅输出到文件

如果你想要禁用控制台日志记录,仅将输出写入文件,则需要一个自定义的 logback-spring.xml 文件,该文件导入 file-appender.xml 但不导入 console-appender.xml,如下例所示:spring-doc.cadn.net.cn

<?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.nameapplication.properties 中添加 application.yaml,如下例所示:spring-doc.cadn.net.cn

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

配置 Log4j 以进行日志记录

Spring Boot 支持在类路径中存在 Log4j 2 时使用它进行日志配置。 如果你使用 Starter 来组装依赖项,则必须排除 Logback,然后改为引入 Log4j 2。 如果你不使用 Starter,则除了 Log4j 2 之外,还需要提供(至少)spring-jclspring-doc.cadn.net.cn

推荐的方式是通过 starters(Starters)进行,即使这种方式需要做一些调整。 以下示例展示了如何在 Maven 中设置 starters:spring-doc.cadn.net.cn

<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 替代,如下例所示:spring-doc.cadn.net.cn

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,请通过将系统属性 https://logging.apache.org/log4j/2.x/log4j-jul.html 设置为 java.util.logging.manager 来配置其JDK 日志适配器

使用 YAML 或 JSON 配置 Log4j 2

除了默认的 XML 配置格式外,Log4j 2 还支持 YAML 和 JSON 配置文件。 要配置 Log4j 2 使用其他配置文件格式,请将相应的依赖项添加到类路径中,并按照所选文件格式命名您的配置文件,如下例所示:spring-doc.cadn.net.cn

格式 依赖项 文件名

YAMLspring-doc.cadn.net.cn

com.fasterxml.jackson.core:jackson-databind + com.fasterxml.jackson.dataformat:jackson-dataformat-yamlspring-doc.cadn.net.cn

log4j2.yaml + log4j2.ymlspring-doc.cadn.net.cn

JSONspring-doc.cadn.net.cn

com.fasterxml.jackson.core:jackson-databindspring-doc.cadn.net.cn

log4j2.json + log4j2.jsnspring-doc.cadn.net.cn

使用组合配置来配置 Log4j 2

Log4j 2 支持将多个配置文件合并为一个复合配置。 要在 Spring Boot 中使用此功能,请通过 logging.log4j2.config.override 配置一个或多个次要配置文件的位置。 这些次要配置文件将与主配置合并,无论主配置的来源是 Spring Boot 的默认配置、标准位置(例如 log4j.xml),还是由 logging.config 属性指定的位置。spring-doc.cadn.net.cn

Log4j2 覆盖配置文件的位置可以加上 optional: 前缀。 例如,optional:classpath:log4j2-override.xml 表示仅当该资源存在时才加载 log4j2-override.xmlspring-doc.cadn.net.cn