記錄

Spring Boot 沒有強制性的記錄依賴項,除了 Commons Logging API,它通常由 Spring Framework 的 spring-jcl 模組提供。若要使用 Logback,您需要在類別路徑中包含它和 spring-jcl。建議的方式是透過 starters,它們都依賴於 spring-boot-starter-logging。對於網路應用程式,您只需要 spring-boot-starter-web,因為它以傳遞方式依賴於 logging starter。如果您使用 Maven,以下依賴項會為您新增記錄功能

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

Spring Boot 有一個 LoggingSystem 抽象層,它嘗試根據類別路徑的內容來組態記錄。如果 Logback 可用,它是首選。

如果您需要對記錄進行的唯一變更是設定各種記錄器的層級,您可以在 application.properties 中使用 "logging.level" 前綴來執行此操作,如下列範例所示

  • 屬性

  • 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 組態,可以 included 在您自己的組態中。這些包含旨在允許重新應用某些常見的 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}logging.file.name 是否在 Boot 的外部組態中設定。

  • ${LOG_PATH}logging.file.path(代表記錄檔所在的目錄)是否在 Boot 的外部組態中設定。

  • ${LOG_EXCEPTION_CONVERSION_WORD}logging.exception-conversion-word 是否在 Boot 的外部組態中設定。

  • ${ROLLING_FILE_NAME_PATTERN}logging.pattern.rolling-file-name 是否在 Boot 的外部組態中設定。

Spring Boot 還在主控台上提供了一些美觀的 ANSI 彩色終端輸出(但不在記錄檔中),方法是使用自訂 Logback 轉換器。請參閱 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>

您也需要在您的 application.propertiesapplication.yaml 中新增 logging.file.name,如下列範例所示

  • 屬性

  • YAML

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

組態 Log4j 以進行記錄

如果 Log4j 2 在類別路徑上,Spring Boot 支援使用它進行記錄組態。如果您使用 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。其中一種方式是使用 模組替換。若要執行此操作,請宣告 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 starters 將常見記錄需求的依賴項收集在一起(例如讓 Tomcat 使用 java.util.logging,但使用 Log4j 2 組態輸出)。
為了確保使用 java.util.logging 執行的偵錯記錄路由到 Log4j 2,請設定其 JDK 記錄適配器,方法是將 java.util.logging.manager 系統屬性設定為 org.apache.logging.log4j.jul.LogManager

使用 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 屬性組態的位置。