日誌記錄

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

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

Java 有很多可用的日誌框架。如果上面的列表看起來令人困惑,請不要擔心。通常,您不需要更改日誌依賴項,並且 Spring Boot 的預設設定工作得很好。
當您將應用程式部署到 servlet 容器或應用程式伺服器時,使用 Java Util Logging API 執行的日誌記錄不會路由到應用程式的日誌中。這可以防止容器或部署到其中的其他應用程式執行的日誌記錄出現在您的應用程式日誌中。

日誌格式

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

2025-11-20T16:37:12.913Z  INFO 127185 --- [myapp] [           main] o.s.b.d.f.logexample.MyApplication       : Starting MyApplication using Java 25.0.1 with PID 127185 (/opt/apps/myapp.jar started by myuser in /opt/apps/)
2025-11-20T16:37:12.925Z  INFO 127185 --- [myapp] [           main] o.s.b.d.f.logexample.MyApplication       : No active profile set, falling back to 1 default profile: "default"
2025-11-20T16:37:15.953Z  INFO 127185 --- [myapp] [           main] o.s.boot.tomcat.TomcatWebServer          : Tomcat initialized with port 8080 (http)
2025-11-20T16:37:16.031Z  INFO 127185 --- [myapp] [           main] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
2025-11-20T16:37:16.032Z  INFO 127185 --- [myapp] [           main] o.apache.catalina.core.StandardEngine    : Starting Servlet engine: [Apache Tomcat/11.0.14]
2025-11-20T16:37:16.171Z  INFO 127185 --- [myapp] [           main] b.w.c.s.WebApplicationContextInitializer : Root WebApplicationContext: initialization completed in 2989 ms
2025-11-20T16:37:17.526Z  INFO 127185 --- [myapp] [           main] o.s.boot.tomcat.TomcatWebServer          : Tomcat started on port 8080 (http) with context path '/'
2025-11-20T16:37:17.570Z  INFO 127185 --- [myapp] [           main] o.s.b.d.f.logexample.MyApplication       : Started MyApplication in 6.187 seconds (process running for 7.574)
2025-11-20T16:37:17.605Z  INFO 127185 --- [myapp] [ionShutdownHook] o.s.boot.tomcat.GracefulShutdown         : Commencing graceful shutdown. Waiting for active requests to complete
2025-11-20T16:37:17.664Z  INFO 127185 --- [myapp] [tomcat-shutdown] o.s.boot.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 組合)啟用跟蹤日誌記錄。

如果您想停用基於控制檯的日誌記錄,可以將 logging.console.enabled 屬性設定為 false

彩色輸出

如果您的終端支援 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 中的一個。可以使用 logging.level.root 配置 root 日誌記錄器。

以下示例顯示了 application.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=DEBUGorg.springframework.web 設定為 DEBUG

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

日誌組

將相關日誌記錄器分組以便可以同時配置它們通常很有用。例如,您可能經常更改所有 Tomcat 相關日誌記錄器的日誌級別,但您無法輕易記住頂級包。

為了解決這個問題,Spring Boot 允許您在 Spring Environment 中定義日誌組。例如,這是您如何透過將其新增到 application.properties 來定義“tomcat”組的方法

  • 屬性

  • 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"

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

  • 屬性

  • YAML

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

Spring Boot 包含以下預定義的日誌記錄組,可直接使用

名稱 日誌器

web

org.springframework.core.codecorg.springframework.httporg.springframework.weborg.springframework.boot.actuate.endpoint.weborg.springframework.boot.web.servlet.ServletContextInitializerBeans

sql

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

使用日誌關閉鉤子

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

  • 屬性

  • YAML

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

自定義日誌配置

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

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

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

根據您的日誌系統,將載入以下檔案

日誌系統 自定義

Logback

logback-spring.xml, logback-spring.groovy, logback.xml, 或 logback.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 轉移到系統屬性。這允許日誌系統配置使用這些屬性。例如,在 application.properties 中設定 logging.file.name 或將 LOGGING_FILE_NAME 作為環境變數,將導致設定 LOG_FILE 系統屬性。下表描述了轉移的屬性

Spring Environment 系統屬性 評論

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

日誌日期格式的附加程式模式。

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(如果可能且未定義為作業系統環境變數,則發現)。

如果您使用 Logback,還會傳輸以下屬性

Spring Environment 系統屬性 評論

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

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

所有支援的日誌系統在解析其配置檔案時都可以查詢系統屬性。有關示例,請參閱 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

  • 屬性

  • 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","logger":"org.example.Application"},"process":{"pid":39599,"thread":{"name":"main"}},"service":{"name":"simple"},"message":"No active profile set, falling back to 1 default profile: \"default\"","ecs":{"version":"8.11"}}

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

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

  • 屬性

  • 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 擴充套件日誌格式 (GELF)

Graylog 擴充套件日誌格式 是一種用於 Graylog 日誌分析平臺的基於 JSON 的日誌格式。

要啟用 Graylog 擴充套件日誌格式,請將相應的 format 屬性設定為 gelf

  • 屬性

  • 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 屬性自定義多個欄位

  • 屬性

  • 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

  • 屬性

  • 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.include & logging.structured.json.exclude

從 JSON 中過濾特定路徑

logging.structured.json.rename

重新命名 JSON 中的特定成員

logging.structured.json.add

向 JSON 新增額外成員

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

  • 屬性

  • 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 檔案中列出它們來宣告實現。

自定義結構化日誌堆疊跟蹤

當訊息與異常一起記錄時,完整的堆疊跟蹤將包含在 JSON 輸出中。這些資訊量可能對您的日誌攝取系統處理起來代價高昂,因此您可能希望調整堆疊跟蹤的列印方式。

為此,您可以使用以下一個或多個屬性

財產 描述

logging.structured.json.stacktrace.root

使用 last 最後列印根項(與 Java 相同)或 first 首先列印根項。

logging.structured.json.stacktrace.max-length

應列印的最大長度

logging.structured.json.stacktrace.max-throwable-depth

每個堆疊跟蹤(包括常見幀和抑制幀)要列印的最大幀數

logging.structured.json.stacktrace.include-common-frames

是否應包含或刪除常見幀

logging.structured.json.stacktrace.include-hashes

是否應包含堆疊跟蹤的雜湊值

例如,以下將使用根優先的堆疊跟蹤,限制其長度,幷包含雜湊值。

  • 屬性

  • YAML

logging.structured.json.stacktrace.root=first
logging.structured.json.stacktrace.max-length=1024
logging.structured.json.stacktrace.include-common-frames=true
logging.structured.json.stacktrace.include-hashes=true
logging:
  structured:
    json:
      stacktrace:
        root: first
        max-length: 1024
        include-common-frames: true
        include-hashes: true

如果您需要完全控制堆疊跟蹤列印,可以將 logging.structured.json.stacktrace.printer 設定為 StackTracePrinter 實現的名稱。您還可以將其設定為 logging-system 以強制使用常規日誌系統堆疊跟蹤輸出。

您的 StackTracePrinter 實現還可以包含一個建構函式引數,該引數接受 StandardStackTracePrinter,如果它希望對從屬性建立的堆疊跟蹤印表機應用進一步的自定義。

支援其他結構化日誌格式

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 配置檔案有選擇地包含或排除配置部分。配置檔案部分在 <configuration> 元素內的任何位置都受支援。使用 name 屬性指定哪個配置檔案接受配置。<springProfile> 標籤可以包含配置檔名稱(例如 staging)或配置檔案表示式。配置檔案表示式允許表達更復雜的配置檔案邏輯,例如 production & (eu-central | eu-west)。有關更多詳細資訊,請檢視 Spring Framework 參考指南。以下列表顯示了三個示例配置檔案

<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 配置檔案選擇性地包含或排除配置部分。配置檔案部分在 <Configuration> 元素內的任何位置都受支援。使用 name 屬性指定哪個配置檔案接受配置。<SpringProfile> 標籤可以包含配置檔名稱(例如 staging)或配置檔案表示式。配置檔案表示式允許表達更復雜的配置檔案邏輯,例如 production & (eu-central | eu-west)。有關更多詳細資訊,請檢視 Spring Framework 參考指南。以下列表顯示了三個示例配置檔案

<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 中獲取。例如,您可以將 log4j2.skipJansi=false 新增到您的 application.properties 檔案中,以便 ConsoleAppender 在 Windows 上使用 Jansi。

只有當系統屬性和作業系統環境變數不包含正在載入的值時,才會考慮 Spring Environment
在 Log4j2 早期初始化期間載入的系統屬性不能引用 Spring Environment。例如,Log4j2 用於允許選擇預設 Log4j2 實現的屬性在 Spring Environment 可用之前使用。
© . This site is unofficial and not affiliated with VMware.