日志记录

Spring Boot 没有强制的日志依赖,除了 Commons Logging API,该 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 可用,它是首选。

如果您需要对日志记录进行的唯一更改是设置各种日志记录器的级别,则可以通过使用“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

  • file-appender.xml - 使用FILE_LOG_PATTERNROLLING_FILE_NAME_PATTERN添加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 进行日志记录配置。如果您使用启动器来组装依赖项,则需要排除 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

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属性配置的位置。