日誌

Spring Boot 沒有強制性的日誌依賴,除了 Commons Logging API,它通常由 Spring Framework 的 spring-jcl 模組提供。要使用 Logback,你需要在類路徑中包含它和 spring-jcl。推薦的方法是透過 Starter,所有 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 抽象,它會嘗試根據類路徑的內容配置日誌。如果 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

  • structured-console-appender.xml - 使用 CONSOLE_LOG_STRUCTURED_FORMAT 中的結構化日誌記錄新增一個 ConsoleAppender

  • file-appender.xml - 使用適當的設定,新增一個使用 FILE_LOG_PATTERNROLLING_FILE_NAME_PATTERNRollingFileAppender

  • structured-file-appender.xml - 使用 ROLLING_FILE_NAME_PATTERN,並在 FILE_LOG_STRUCTURED_FORMAT 中進行結構化日誌記錄,新增一個 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 進行日誌配置。如果你使用 Starter 來組裝依賴,你需要排除 Logback,然後包含 Log4j 2。如果你不使用 Starter,除了 Log4j 2 之外,你至少還需要提供 spring-jcl

推薦的方法是透過 Starter,儘管這需要一些調整。以下示例展示瞭如何在 Maven 中設定 Starter

<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,如下例所示

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,透過將 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 屬性配置的位置。