日誌

Spring Boot 對所有內部日誌記錄使用 Commons Logging,但底層日誌實現是開放的。為 Java Util LoggingLog4j2Logback 提供了預設配置。在每種情況下,日誌記錄器都預配置為使用控制檯輸出,並可選地提供檔案輸出。

預設情況下,如果你使用 starter,會使用 Logback 進行日誌記錄。還包括適當的 Logback 路由,以確保使用 Java Util Logging、Commons Logging、Log4J 或 SLF4J 的依賴庫都能正常工作。

Java 有許多可用的日誌框架。如果上面的列表讓你感到困惑,請不用擔心。通常情況下,你無需更改日誌依賴項,Spring Boot 的預設設定就能很好地工作。
當你將應用部署到 Servlet 容器或應用伺服器時,使用 Java Util Logging API 執行的日誌不會路由到你的應用日誌中。這可以防止由容器或部署到其中的其他應用執行的日誌出現在你的應用日誌中。

日誌格式

Spring Boot 的預設日誌輸出類似於以下示例

2025-04-24T13:04:32.244Z  INFO 127615 --- [myapp] [           main] o.s.b.d.f.logexample.MyApplication       : Starting MyApplication using Java 17.0.15 with PID 127615 (/opt/apps/myapp.jar started by myuser in /opt/apps/)
2025-04-24T13:04:32.277Z  INFO 127615 --- [myapp] [           main] o.s.b.d.f.logexample.MyApplication       : No active profile set, falling back to 1 default profile: "default"
2025-04-24T13:04:37.586Z  INFO 127615 --- [myapp] [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port 8080 (http)
2025-04-24T13:04:37.655Z  INFO 127615 --- [myapp] [           main] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
2025-04-24T13:04:37.657Z  INFO 127615 --- [myapp] [           main] o.apache.catalina.core.StandardEngine    : Starting Servlet engine: [Apache Tomcat/10.1.40]
2025-04-24T13:04:37.818Z  INFO 127615 --- [myapp] [           main] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
2025-04-24T13:04:37.820Z  INFO 127615 --- [myapp] [           main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 5186 ms
2025-04-24T13:04:39.165Z  INFO 127615 --- [myapp] [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port 8080 (http) with context path '/'
2025-04-24T13:04:39.199Z  INFO 127615 --- [myapp] [           main] o.s.b.d.f.logexample.MyApplication       : Started MyApplication in 9.336 seconds (process running for 10.225)
2025-04-24T13:04:39.250Z  INFO 127615 --- [myapp] [ionShutdownHook] o.s.b.w.e.tomcat.GracefulShutdown        : Commencing graceful shutdown. Waiting for active requests to complete
2025-04-24T13:04:39.268Z  INFO 127615 --- [myapp] [tomcat-shutdown] o.s.b.w.e.tomcat.GracefulShutdown        : Graceful shutdown complete

輸出以下項

  • 日期和時間:精確到毫秒,易於排序。

  • 日誌級別:ERRORWARNINFODEBUGTRACE

  • 程序 ID。

  • 一個 --- 分隔符,用於區分實際日誌訊息的開始。

  • 應用名稱:用方括號括起來(僅在設定了 spring.application.name 時預設記錄)

  • 應用分組:用方括號括起來(僅在設定了 spring.application.group 時預設記錄)

  • 執行緒名稱:用方括號括起來(在控制檯輸出中可能會被截斷)。

  • 關聯 ID:如果啟用了跟蹤(未在上面的示例中顯示)

  • 日誌記錄器名稱:通常是源類名(經常縮寫)。

  • 日誌訊息。

Logback 沒有 FATAL 級別。它被對映到 ERROR
如果你設定了 spring.application.name 屬性但不想記錄它,可以將 logging.include-application-name 設定為 false
如果你設定了 spring.application.group 屬性但不想記錄它,可以將 logging.include-application-group 設定為 false
有關關聯 ID 的更多詳細資訊,請參閱此文件

控制檯輸出

預設日誌配置會將訊息寫入控制檯時進行回顯。預設情況下,會記錄 ERROR 級別、WARN 級別和 INFO 級別的訊息。你還可以透過使用 --debug 標誌啟動應用來啟用“除錯”模式。

$ java -jar myapp.jar --debug
你也可以在你的 application.properties 中指定 debug=true

啟用除錯模式後,會配置一部分核心日誌記錄器(嵌入式容器、Hibernate 和 Spring Boot)輸出更多資訊。啟用除錯模式並不會配置你的應用以 DEBUG 級別記錄所有訊息。

或者,你可以透過使用 --trace 標誌(或在你的 application.properties 中設定 trace=true)啟動應用來啟用“跟蹤”模式。這樣做會為一部分核心日誌記錄器(嵌入式容器、Hibernate 模式生成以及整個 Spring 體系)啟用跟蹤日誌記錄。

彩色輸出

如果你的終端支援 ANSI,會使用彩色輸出以提高可讀性。你可以將 spring.output.ansi.enabled 設定為支援的值來覆蓋自動檢測。

透過使用 %clr 轉換詞來配置顏色編碼。在最簡單的形式下,轉換器會根據日誌級別為輸出著色,如下例所示

%clr(%5p)

下表描述了日誌級別到顏色的對映

級別 顏色

FATAL

紅色

ERROR

紅色

WARN

黃色

INFO

綠色

DEBUG

綠色

TRACE

綠色

或者,你可以透過將顏色或樣式作為轉換的選項來指定應使用的顏色或樣式。例如,要使文字顯示為黃色,使用以下設定

%clr(%d{yyyy-MM-dd'T'HH:mm:ss.SSSXXX}){yellow}

支援以下顏色和樣式

  • 藍色

  • 青色

  • 暗淡

  • 綠色

  • 洋紅色

  • 紅色

  • 黃色

檔案輸出

預設情況下,Spring Boot 只將日誌輸出到控制檯,不寫入日誌檔案。如果你想除了控制檯輸出外還寫入日誌檔案,你需要設定 logging.file.namelogging.file.path 屬性(例如,在你的 application.properties 中)。如果這兩個屬性都設定了,logging.file.path 將被忽略,只使用 logging.file.name

下表顯示瞭如何一起使用 logging.* 屬性

表 1. 日誌屬性
logging.file.name logging.file.path 描述

(無)

(無)

僅控制檯日誌記錄。

特定檔案(例如,my.log

(無)

寫入 logging.file.name 指定的位置。位置可以是絕對路徑或相對於當前目錄的相對路徑。

(無)

特定目錄(例如,/var/log

spring.log 寫入 logging.file.path 指定的目錄。目錄可以是絕對路徑或相對於當前目錄的相對路徑。

特定檔案

特定目錄

寫入 logging.file.name 指定的位置,忽略 logging.file.path。位置可以是絕對路徑或相對於當前目錄的相對路徑。

日誌檔案達到 10 MB 時會輪轉,與控制檯輸出一樣,預設情況下會記錄 ERROR 級別、WARN 級別和 INFO 級別的訊息。

日誌屬性獨立於實際的日誌基礎設施。因此,特定的配置鍵(例如 Logback 的 logback.configurationFile)不由 Spring Boot 管理。

檔案輪轉

如果你使用 Logback,可以使用你的 application.propertiesapplication.yaml 檔案微調日誌輪轉設定。對於所有其他日誌系統,你需要自己直接配置輪轉設定(例如,如果你使用 Log4j2,可以新增 log4j2.xmllog4j2-spring.xml 檔案)。

支援以下輪轉策略屬性

名稱 描述

logging.logback.rollingpolicy.file-name-pattern

用於建立日誌歸檔的檔名模式。

logging.logback.rollingpolicy.clean-history-on-start

應用啟動時是否應清理日誌歸檔。

logging.logback.rollingpolicy.max-file-size

在日誌檔案被歸檔前的最大大小。

logging.logback.rollingpolicy.total-size-cap

日誌歸檔在被刪除前的最大總大小。

logging.logback.rollingpolicy.max-history

保留的歸檔日誌檔案的最大數量(預設為 7)。

日誌級別

所有支援的日誌系統都可以透過在 Spring Environment 中設定日誌記錄器級別(例如,在 application.properties 中),使用 logging.level.<logger-name>=<level> 格式,其中 level 是 TRACE、DEBUG、INFO、WARN、ERROR、FATAL 或 OFF 中的一個。root 日誌記錄器可以使用 logging.level.root 進行配置。

以下示例顯示了 application.properties 中可能的日誌設定

  • Properties

  • YAML

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

也可以使用環境變數設定日誌級別。例如,LOGGING_LEVEL_ORG_SPRINGFRAMEWORK_WEB=DEBUG 會將 org.springframework.web 的級別設定為 DEBUG

上述方法只適用於包級別的日誌記錄。由於 relaxed binding 總是將環境變數轉換為小寫,因此無法透過這種方式配置單個類的日誌記錄。如果你需要配置某個類的日誌記錄,可以使用 SPRING_APPLICATION_JSON 變數。

日誌分組

通常將相關的日誌記錄器分組在一起非常有用,這樣可以同時配置它們。例如,你可能經常需要更改所有與 Tomcat 相關的日誌記錄器的日誌級別,但你可能無法輕鬆記住頂層包名。

為了提供幫助,Spring Boot 允許你在 Spring Environment 中定義日誌分組。例如,你可以透過將其新增到你的 application.properties 來定義一個名為“tomcat”的分組

  • Properties

  • YAML

logging.group.tomcat=org.apache.catalina,org.apache.coyote,org.apache.tomcat
logging:
  group:
    tomcat: "org.apache.catalina,org.apache.coyote,org.apache.tomcat"

定義後,你可以透過一行程式碼更改分組中所有日誌記錄器的級別

  • Properties

  • YAML

logging.level.tomcat=trace
logging:
  level:
    tomcat: "trace"

Spring Boot 包括以下預定義的日誌分組,可以直接使用

名稱 日誌記錄器

web

org.springframework.core.codec, org.springframework.http, org.springframework.web, org.springframework.boot.actuate.endpoint.web, org.springframework.boot.web.servlet.ServletContextInitializerBeans

sql

org.springframework.jdbc.core, org.hibernate.SQL, LoggerListener

使用日誌關閉鉤子

為了在應用終止時釋放日誌資源,提供了一個關閉鉤子,它會在 JVM 退出時觸發日誌系統清理。除非你的應用部署為 war 檔案,否則此關閉鉤子會自動註冊。如果你的應用具有複雜的上下文層次結構,則關閉鉤子可能無法滿足你的需求。如果不能滿足,請停用關閉鉤子並研究底層日誌系統直接提供的選項。例如,Logback 提供了上下文選擇器,允許在自己的上下文中建立每個 Logger。你可以使用 logging.register-shutdown-hook 屬性停用關閉鉤子。將其設定為 false 將停用註冊。你可以在你的 application.propertiesapplication.yaml 檔案中設定此屬性

  • Properties

  • YAML

logging.register-shutdown-hook=false
logging:
  register-shutdown-hook: false

自定義日誌配置

透過在類路徑中包含相應的庫,可以啟用各種日誌系統,並且可以透過在類路徑的根目錄或由以下 Spring Environment 屬性指定的位置提供合適的配置檔案來進一步定製:logging.config

你可以透過使用 org.springframework.boot.logging.LoggingSystem 系統屬性強制 Spring Boot 使用特定的日誌系統。該值應是 LoggingSystem 實現的完全限定類名。你也可以透過使用值 none 完全停用 Spring Boot 的日誌配置。

由於日誌記錄在 ApplicationContext 建立之前初始化,因此無法透過 Spring @Configuration 檔案中的 @PropertySources 控制日誌記錄。更改日誌系統或完全停用它的唯一方法是透過 System properties。

根據你的日誌系統,會載入以下檔案

日誌系統 定製

Logback

logback-spring.xmllogback-spring.groovylogback.xmllogback.groovy

Log4j2

log4j2-spring.xmllog4j2.xml

JDK (Java Util Logging)

logging.properties

如果可能,我們建議你對日誌配置使用 -spring 變體(例如,使用 logback-spring.xml 而不是 logback.xml)。如果你使用標準配置位置,Spring 無法完全控制日誌初始化。
Java Util Logging 存在已知的類載入問題,在從“可執行 jar”執行時會導致問題。如果可能,我們建議你在從“可執行 jar”執行時避免使用它。

為了幫助定製,一些其他屬性從 Spring Environment 轉移到 System properties。這使得日誌系統配置可以消費這些屬性。例如,在 application.properties 中設定 logging.file.name 或將 LOGGING_FILE_NAME 設定為環境變數,將導致 LOG_FILE 系統屬性被設定。轉移的屬性如下表所示

Spring Environment System Property 註釋

logging.exception-conversion-word

LOG_EXCEPTION_CONVERSION_WORD

記錄異常時使用的轉換詞。

logging.file.name

LOG_FILE

如果定義,將在預設日誌配置中使用。

logging.file.path

LOG_PATH

如果定義,將在預設日誌配置中使用。

logging.pattern.console

CONSOLE_LOG_PATTERN

在控制檯 (stdout) 上使用的日誌模式。

logging.pattern.dateformat

LOG_DATEFORMAT_PATTERN

日誌日期格式的 Appender 模式。

logging.charset.console

CONSOLE_LOG_CHARSET

控制檯日誌記錄使用的字元集。

logging.threshold.console

CONSOLE_LOG_THRESHOLD

控制檯日誌記錄使用的日誌級別閾值。

logging.pattern.file

FILE_LOG_PATTERN

在檔案中使用的日誌模式(如果 LOG_FILE 啟用)。

logging.charset.file

FILE_LOG_CHARSET

檔案日誌記錄使用的字元集(如果 LOG_FILE 啟用)。

logging.threshold.file

FILE_LOG_THRESHOLD

檔案日誌記錄使用的日誌級別閾值。

logging.pattern.level

LOG_LEVEL_PATTERN

渲染日誌級別時使用的格式(預設 %5p)。

logging.structured.format.console

CONSOLE_LOG_STRUCTURED_FORMAT

控制檯日誌記錄使用的結構化日誌格式。

logging.structured.format.file

FILE_LOG_STRUCTURED_FORMAT

檔案日誌記錄使用的結構化日誌格式。

PID

PID

當前程序 ID(如果可能則發現,並且在未作為 OS 環境變數定義時)。

如果你使用 Logback,也會轉移以下屬性

Spring Environment System Property 註釋

logging.logback.rollingpolicy.file-name-pattern

LOGBACK_ROLLINGPOLICY_FILE_NAME_PATTERN

輪轉日誌檔名的模式(預設 ${LOG_FILE}.%d{yyyy-MM-dd}.%i.gz)。

logging.logback.rollingpolicy.clean-history-on-start

LOGBACK_ROLLINGPOLICY_CLEAN_HISTORY_ON_START

啟動時是否清理歸檔日誌檔案。

logging.logback.rollingpolicy.max-file-size

LOGBACK_ROLLINGPOLICY_MAX_FILE_SIZE

最大日誌檔案大小。

logging.logback.rollingpolicy.total-size-cap

LOGBACK_ROLLINGPOLICY_TOTAL_SIZE_CAP

保留的日誌備份總大小。

logging.logback.rollingpolicy.max-history

LOGBACK_ROLLINGPOLICY_MAX_HISTORY

保留的歸檔日誌檔案最大數量。

所有支援的日誌系統在解析其配置檔案時都可以參考 System properties。請參閱 spring-boot.jar 中的預設配置示例

如果你想在日誌屬性中使用佔位符,應該使用 Spring Boot 的語法,而不是底層框架的語法。特別是,如果你使用 Logback,你應該使用 : 作為屬性名及其預設值之間的分隔符,而不是使用 :-

你可以透過僅覆蓋 LOG_LEVEL_PATTERN(或與 Logback 一起使用的 logging.pattern.level)向日志行新增 MDC 和其他臨時內容。例如,如果你使用 logging.pattern.level=user:%X{user} %5p,則預設日誌格式將包含一個名為 "user" 的 MDC 條目(如果存在),如下例所示。

2019-08-30 12:30:04.031 user:someone INFO 22174 --- [  nio-8080-exec-0] demo.Controller
Handling authenticated request

結構化日誌記錄

結構化日誌記錄是一種將日誌輸出寫入定義明確、通常機器可讀的格式的技術。Spring Boot 支援結構化日誌記錄,並開箱即用支援以下 JSON 格式

要啟用結構化日誌記錄,請將屬性 logging.structured.format.console(用於控制檯輸出)或 logging.structured.format.file(用於檔案輸出)設定為你要使用的格式 ID。

如果你正在使用自定義日誌配置,請更新你的配置以遵循 CONSOLE_LOG_STRUCTURED_FORMATFILE_LOG_STRUCTURED_FORMAT 系統屬性。以 CONSOLE_LOG_STRUCTURED_FORMAT 為例

  • Logback

  • Log4j2

<!-- replace your encoder with StructuredLogEncoder -->
<encoder class="org.springframework.boot.logging.logback.StructuredLogEncoder">
	<format>${CONSOLE_LOG_STRUCTURED_FORMAT}</format>
	<charset>${CONSOLE_LOG_CHARSET}</charset>
</encoder>

你也可以參考 Spring Boot 中包含的預設配置

<!-- replace your PatternLayout with StructuredLogLayout -->
<StructuredLogLayout format="${sys:CONSOLE_LOG_STRUCTURED_FORMAT}" charset="${sys:CONSOLE_LOG_CHARSET}"/>

你也可以參考 Spring Boot 中包含的預設配置

Elastic Common Schema

Elastic Common Schema 是一種基於 JSON 的日誌格式。

要啟用 Elastic Common Schema 日誌格式,請將相應的 format 屬性設定為 ecs

  • Properties

  • YAML

logging.structured.format.console=ecs
logging.structured.format.file=ecs
logging:
  structured:
    format:
      console: ecs
      file: ecs

日誌行看起來像這樣

{"@timestamp":"2024-01-01T10:15:00.067462556Z","log.level":"INFO","process.pid":39599,"process.thread.name":"main","service.name":"simple","log.logger":"org.example.Application","message":"No active profile set, falling back to 1 default profile: \"default\"","ecs.version":"8.11"}

此格式還會將 MDC 中包含的每個鍵值對新增到 JSON 物件。你也可以使用SLF4J 流式日誌 API 透過 addKeyValue 方法將鍵值對新增到日誌 JSON 物件中。

可以使用 logging.structured.ecs.service 屬性自定義 service

  • Properties

  • YAML

logging.structured.ecs.service.name=MyService
logging.structured.ecs.service.version=1
logging.structured.ecs.service.environment=Production
logging.structured.ecs.service.node-name=Primary
logging:
  structured:
    ecs:
      service:
        name: MyService
        version: 1.0
        environment: Production
        node-name: Primary
如果未指定 logging.structured.ecs.service.name,則預設為 spring.application.name
如果未指定 logging.structured.ecs.service.version,則預設為 spring.application.version

Graylog Extended Log Format (GELF)

Graylog Extended Log Format 是一種基於 JSON 的日誌格式,用於 Graylog 日誌分析平臺。

要啟用 Graylog Extended Log Format,請將相應的 format 屬性設定為 gelf

  • Properties

  • YAML

logging.structured.format.console=gelf
logging.structured.format.file=gelf
logging:
  structured:
    format:
      console: gelf
      file: gelf

日誌行看起來像這樣

{"version":"1.1","short_message":"No active profile set, falling back to 1 default profile: \"default\"","timestamp":1725958035.857,"level":6,"_level_name":"INFO","_process_pid":47649,"_process_thread_name":"main","_log_logger":"org.example.Application"}

此格式還會將 MDC 中包含的每個鍵值對新增到 JSON 物件。你也可以使用SLF4J 流式日誌 API 透過 addKeyValue 方法將鍵值對新增到日誌 JSON 物件中。

可以使用 logging.structured.gelf 屬性自定義一些欄位

  • Properties

  • YAML

logging.structured.gelf.host=MyService
logging.structured.gelf.service.version=1
logging:
  structured:
    gelf:
      host: MyService
      service:
        version: 1.0
如果未指定 logging.structured.gelf.host,則預設為 spring.application.name
如果未指定 logging.structured.gelf.service.version,則預設為 spring.application.version

Logstash JSON 格式

Logstash JSON 格式 是一個基於 JSON 的日誌格式。

要啟用 Logstash JSON 日誌格式,請將相應的 format 屬性設定為 logstash

  • Properties

  • YAML

logging.structured.format.console=logstash
logging.structured.format.file=logstash
logging:
  structured:
    format:
      console: logstash
      file: logstash

日誌行看起來像這樣

{"@timestamp":"2024-01-01T10:15:00.111037681+02:00","@version":"1","message":"No active profile set, falling back to 1 default profile: \"default\"","logger_name":"org.example.Application","thread_name":"main","level":"INFO","level_value":20000}

此格式還會將 MDC 中包含的每個鍵值對新增到 JSON 物件。你也可以使用SLF4J 流式日誌 API 透過 addKeyValue 方法將鍵值對新增到日誌 JSON 物件中。

如果你新增 標記,它們將以一個 tags 字串陣列的形式出現在 JSON 中。

自定義結構化日誌 JSON

Spring Boot 會為結構化日誌輸出的 JSON 名稱和值選擇合理的預設值。然而,有時你可能需要根據自己的需求對 JSON 進行一些微調。例如,你可能想要更改某些名稱以匹配你的日誌攝取系統的預期。你可能還想過濾掉某些成員,因為你覺得它們沒用。

以下屬性允許你更改結構化日誌 JSON 的寫入方式

屬性 描述

logging.structured.json.includelogging.structured.json.exclude

從 JSON 中過濾掉特定路徑

logging.structured.json.rename

重新命名 JSON 中的特定成員

logging.structured.json.add

向 JSON 中新增額外的成員

例如,以下設定將排除 log.level,將 process.id 重新命名為 procid,並新增一個固定的 corpname 欄位

  • Properties

  • YAML

logging.structured.json.exclude=log.level
logging.structured.json.rename.process.id=procid
logging.structured.json.add.corpname=mycorp
logging:
  structured:
    json:
      exclude: log.level
      rename:
        process.id: procid
      add:
        corpname: mycorp
對於更高階的自定義,你可以編寫自己的類來實現 StructuredLoggingJsonMembersCustomizer 介面,並使用 logging.structured.json.customizer 屬性宣告它。你還可以透過將實現列在 META-INF/spring.factories 檔案中來宣告它們。

支援其他結構化日誌格式

Spring Boot 中的結構化日誌支援是可擴充套件的,允許你定義自己的自定義格式。為此,請實現 StructuredLogFormatter 介面。使用 Logback 時,泛型型別引數必須是 ILoggingEvent;使用 Log4j2 時,必須是 LogEvent(這意味著你的實現與特定的日誌系統繫結)。然後,你的實現將透過日誌事件被呼叫,並返回要記錄的 String,如本例所示

  • Java

  • Kotlin

import ch.qos.logback.classic.spi.ILoggingEvent;

import org.springframework.boot.logging.structured.StructuredLogFormatter;

class MyCustomFormat implements StructuredLogFormatter<ILoggingEvent> {

	@Override
	public String format(ILoggingEvent event) {
		return "time=" + event.getInstant() + " level=" + event.getLevel() + " message=" + event.getMessage() + "\n";
	}

}
import ch.qos.logback.classic.spi.ILoggingEvent
import org.springframework.boot.logging.structured.StructuredLogFormatter

class MyCustomFormat : StructuredLogFormatter<ILoggingEvent> {

	override fun format(event: ILoggingEvent): String {
		return "time=${event.instant} level=${event.level} message=${event.message}\n"
	}

}

如示例所示,你可以返回任何格式,不一定非要是 JSON。

要啟用你的自定義格式,請將屬性 logging.structured.format.consolelogging.structured.format.file 設定為你實現的完全限定類名。

你的實現可以使用一些建構函式引數,這些引數會自動注入。更多詳細資訊,請參閱 StructuredLogFormatter 的 JavaDoc。

Logback 擴充套件

Spring Boot 包含一些 Logback 擴充套件,可以幫助進行高階配置。你可以在 logback-spring.xml 配置檔案中使用這些擴充套件。

由於標準的 logback.xml 配置檔案載入得太早,你無法在其中使用擴充套件。你需要使用 logback-spring.xml 或定義一個 logging.config 屬性。
這些擴充套件不能與 Logback 的配置掃描一起使用。如果你嘗試這樣做,更改配置檔案會導致記錄類似於以下內容之一的錯誤
ERROR in ch.qos.logback.core.joran.spi.Interpreter@4:71 - no applicable action for [springProperty], current ElementPath is [[configuration][springProperty]]
ERROR in ch.qos.logback.core.joran.spi.Interpreter@4:71 - no applicable action for [springProfile], current ElementPath is [[configuration][springProfile]]

特定配置檔案的配置

<springProfile> 標籤允許你根據活躍的 Spring profiles 選擇性地包含或排除配置部分。Profile 部分可以在 <configuration> 元素內的任何地方使用。使用 name 屬性指定哪個 profile 接受該配置。 標籤可以包含 profile 名稱(例如 staging)或 profile 表示式。Profile 表示式允許表達更復雜的 profile 邏輯,例如 production & (eu-central | eu-west)。更多詳細資訊,請查閱 Spring Framework 參考指南。以下列表顯示了三個示例 profile

<springProfile name="staging">
	<!-- configuration to be enabled when the "staging" profile is active -->
</springProfile>

<springProfile name="dev | staging">
	<!-- configuration to be enabled when the "dev" or "staging" profiles are active -->
</springProfile>

<springProfile name="!production">
	<!-- configuration to be enabled when the "production" profile is not active -->
</springProfile>

環境屬性

<springProperty> 標籤允許你從 Spring Environment 中暴露屬性供 Logback 使用。如果你想在 Logback 配置中訪問 application.properties 檔案中的值,這樣做會很有用。該標籤的工作方式類似於 Logback 標準的 <property> 標籤。然而,與其指定直接的 value,你指定屬性的 source(來自 Environment)。如果你需要將屬性儲存在 local 範圍之外的地方,可以使用 scope 屬性。如果你需要一個備用值(以防屬性在 Environment 中未設定),可以使用 defaultValue 屬性。以下示例展示瞭如何在 Logback 中暴露屬性供使用

<springProperty scope="context" name="fluentHost" source="myapp.fluentd.host"
		defaultValue="localhost"/>
<appender name="FLUENT" class="ch.qos.logback.more.appenders.DataFluentAppender">
	<remoteHost>${fluentHost}</remoteHost>
	...
</appender>
source 必須以 kebab-case 形式指定(例如 my.property-name)。然而,可以使用寬鬆規則將屬性新增到 Environment 中。

Log4j2 擴充套件

Spring Boot 包含一些 Log4j2 擴充套件,可以幫助進行高階配置。你可以在任何 log4j2-spring.xml 配置檔案中使用這些擴充套件。

由於標準的 log4j2.xml 配置檔案載入得太早,你無法在其中使用擴充套件。你需要使用 log4j2-spring.xml 或定義一個 logging.config 屬性。
這些擴充套件取代了 Log4J 提供的 Spring Boot 支援。你應該確保在構建中不包含 org.apache.logging.log4j:log4j-spring-boot 模組。

特定配置檔案的配置

<SpringProfile> 標籤允許你根據活躍的 Spring profiles 選擇性地包含或排除配置部分。Profile 部分可以在 <Configuration> 元素內的任何地方使用。使用 name 屬性指定哪個 profile 接受該配置。 標籤可以包含 profile 名稱(例如 staging)或 profile 表示式。Profile 表示式允許表達更復雜的 profile 邏輯,例如 production & (eu-central | eu-west)。更多詳細資訊,請查閱 Spring Framework 參考指南。以下列表顯示了三個示例 profile

<SpringProfile name="staging">
	<!-- configuration to be enabled when the "staging" profile is active -->
</SpringProfile>

<SpringProfile name="dev | staging">
	<!-- configuration to be enabled when the "dev" or "staging" profiles are active -->
</SpringProfile>

<SpringProfile name="!production">
	<!-- configuration to be enabled when the "production" profile is not active -->
</SpringProfile>

環境屬性查詢

如果你想在 Log4j2 配置中引用 Spring Environment 中的屬性,可以使用帶有 spring: 字首的查詢。如果你想在 Log4j2 配置中訪問 application.properties 檔案中的值,這樣做會很有用。

以下示例展示瞭如何設定名為 applicationNameapplicationGroup 的 Log4j2 屬性,它們從 Spring Environment 讀取 spring.application.namespring.application.group

<Properties>
	<Property name="applicationName">${spring:spring.application.name}</Property>
	<Property name="applicationGroup">${spring:spring.application.group}</Property>
</Properties>
查詢鍵應以 kebab-case 形式指定(例如 my.property-name)。

Log4j2 系統屬性

Log4j2 支援許多系統屬性,可用於配置各種項。例如,log4j2.skipJansi 系統屬性可用於配置 ConsoleAppender 是否會在 Windows 上嘗試使用 Jansi 輸出流。

Log4j2 初始化後加載的所有系統屬性都可以從 Spring Environment 中獲取。例如,你可以在 application.properties 檔案中新增 log4j2.skipJansi=false,以便 ConsoleAppender 在 Windows 上使用 Jansi。

只有當系統屬性和作業系統環境變數不包含要載入的值時,才會考慮 Spring Environment
Log4j2 早期初始化期間載入的系統屬性無法引用 Spring Environment。例如,Log4j2 用於選擇預設 Log4j2 實現的屬性在使用時,Spring Environment 尚未可用。