83. Logging

除了通常由 Spring Framework 的spring-jcl模块提供的 Commons Logging API 以外,Spring Boot 没有强制性的日志记录依赖项。要使用Logback,您需要在 Classpath 中包括它和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抽象,该抽象试图基于 Classpath 的内容配置日志记录。如果可以使用 Logback,则它是首选。

如果您唯一需要对日志记录进行的更改是设置各种 Logger 的级别,则可以使用“ logging.level”前缀在application.properties中进行设置,如以下示例所示:

logging.level.org.springframework.web=DEBUG
logging.level.org.hibernate=ERROR

您还可以使用“ logging.file”设置日志的文件位置(控制台除外)。

要配置日志记录系统的更细粒度的设置,您需要使用所讨论的LoggingSystem支持的本机配置格式。默认情况下,Spring Boot 从系统的默认位置(例如classpath:logback.xml用于 Logback)获取本地配置,但是您可以使用“ logging.config”属性来设置配置文件的位置。

83.1 配置日志记录的日志回传

如果将logback.xml放在 Classpath 的根目录中,则从那里(或从logback-spring.xml拾取它,以利用 Boot 提供的模板功能)。 Spring Boot 提供了一个默认的基本配置,如果您想设置级别,可以将其包括在内,如以下示例所示:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
	<include resource="org/springframework/boot/logging/logback/base.xml"/>
	<logger name="org.springframework.web" level="DEBUG"/>
</configuration>

如果您在 spring-boot jar 中查看base.xml,您会发现它使用了一些有用的 System 属性,而LoggingSystem会为您创建这些属性:

  • ${PID}:当前进程 ID。

  • ${LOG_FILE}:是否在 Boot 的外部配置中设置了logging.file

  • ${LOG_PATH}:是否在 Boot 的外部配置中设置了logging.path(表示要存放日志文件的目录)。

  • ${LOG_EXCEPTION_CONVERSION_WORD}:是否在 Boot 的外部配置中设置了logging.exception-conversion-word

通过使用自定义的 Logback 转换器,Spring Boot 还可以在控制台上提供一些不错的 ANSI 颜色终端输出(但不在日志文件中)。有关详细信息,请参见默认的base.xml配置。

如果 Groovy 在 Classpath 上,那么您也应该能够使用logback.groovy配置 Logback。如果存在,则优先考虑此设置。

83.1.1 为仅文件输出配置 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添加到application.properties,如以下示例所示:

logging.file=myapplication.log

83.2 配置 Log4j 进行日志记录

如果 Spring Boot 在 Classpath 中,则支持Log4j 2进行日志记录配置。如果使用 Starter 程序来组装依赖项,则必须排除 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 中设置启动器的一种方法:

dependencies {
	compile 'org.springframework.boot:spring-boot-starter-web'
	compile 'org.springframework.boot:spring-boot-starter-log4j2'
}

configurations {
	all {
		exclude group: 'org.springframework.boot', module: 'spring-boot-starter-logging'
	}
}

Note

Log4j Starter 人员将依赖关系集中在一起,以满足常见的日志记录要求(例如让 Tomcat 使用java.util.logging,但使用 Log4j 2 配置输出)。有关详细信息,请参见Actuator Log4j 2示例,并查看实际效果。

Note

为了确保将使用java.util.logging执行的调试日志记录路由到 Log4j 2 中,可以通过将java.util.logging.manager系统属性设置为org.apache.logging.log4j.jul.LogManager来配置其JDK 记录适配器

83.2.1 使用 YAML 或 JSON 配置 Log4j 2

除了默认的 XML 配置格式外,Log4j 2 还支持 YAML 和 JSON 配置文件。要将 Log4j 2 配置为使用备用配置文件格式,请将适当的依赖项添加到 Classpath 中,并为您的配置文件命名以匹配您选择的文件格式,如以下示例所示:

FormatDependenciesFile names
YAMLcom.fasterxml.jackson.core:jackson-databind com.fasterxml.jackson.dataformat:jackson-dataformat-yamllog4j2.yaml log4j2.yml
JSONcom.fasterxml.jackson.core:jackson-databindlog4j2.json log4j2.jsn