天天看點

Springboot日志記錄方案—官方原版

作者:Doker多克

一、 概述

Spring Boot 對所有内部日志記錄使用 Commons Logging,但使底層日志實作保持打開狀态。 為 Java Util Logging、Log4j2 和 Logback 提供了預設配置。 在每種情況下,記錄器都預先配置為使用控制台輸出,并提供可選的檔案輸出。

預設情況下,如果您使用“初學者”,則使用登入進行日志記錄。 還包括适當的 Logback 路由,以確定使用 Java Util Logging、Commons Logging、Log4J 或 SLF4J 的依賴庫都能正常工作。

二、日志格式

Spring Boot的預設日志輸出類似于以下示例:

2023-02-23T14:18:26.407Z  INFO 20239 --- [           main] o.s.b.d.f.s.MyApplication                : Starting MyApplication using Java 17.0.6 with PID 20239 (/opt/apps/myapp.jar started by myuser in /opt/apps/)
2023-02-23T14:18:26.414Z  INFO 20239 --- [           main] o.s.b.d.f.s.MyApplication                : No active profile set, falling back to 1 default profile: "default"
2023-02-23T14:18:28.434Z  INFO 20239 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port(s): 8080 (http)
2023-02-23T14:18:28.563Z  INFO 20239 --- [           main] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
2023-02-23T14:18:28.563Z  INFO 20239 --- [           main] o.apache.catalina.core.StandardEngine    : Starting Servlet engine: [Apache Tomcat/10.1.5]
2023-02-23T14:18:28.976Z  INFO 20239 --- [           main] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
2023-02-23T14:18:28.990Z  INFO 20239 --- [           main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 2444 ms
2023-02-23T14:18:32.397Z  INFO 20239 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8080 (http) with context path ''
2023-02-23T14:18:32.438Z  INFO 20239 --- [           main] o.s.b.d.f.s.MyApplication                : Started MyApplication in 7.241 seconds (process running for 8.232)           
  • 輸出以下項目:
  • 日期和時間:毫秒精度,易于排序。
  • 日志級别:錯誤、警告、資訊、調試或跟蹤。
  • 程序ID。
  • 分隔符,用于區分實際日志消息的開頭。
  • 線程名稱:用方括号括起來(對于控制台輸出,可以截斷)。
  • 記錄器名稱:這通常是源類名(通常縮寫)。
  • 日志消息。

三、控制台輸出

預設日志配置在寫入消息時将消息回顯到控制台。預設情況下,記錄ERROR級别、WARN級别和INFO級别消息。您還可以通過使用--debug标志啟動應用程式來啟用“調試”模式。

$ java -jar myapp.jar --debug           

啟用調試模式後,将配置一組核心記錄器(嵌入式容器、Hibernate和Spring Boot)以輸出更多資訊。啟用調試模式不會将應用程式配置為使用debug級别記錄所有消息。

或者,您可以通過使用--trace标志啟動應用程式來啟用“跟蹤”模式(或在應用程式中使用trace=true。财産)。這樣可以為選擇的核心記錄器(嵌入式容器、Hibernate模式生成和整個Spring組合)啟用跟蹤日志記錄。

四、不同顔色編碼輸出

如果您的終端支援ANSI,則使用顔色輸出來提高可讀性。您可以将spring.output.ansi.enabled設定為支援的值,以覆寫自動檢測。

通過使用%clr轉換字配置顔色編碼。在最簡單的形式中,轉換器根據日志級别為輸出着色,如下例所示:

%clr(%5p)           

下表描述了日志級别到顔色的映射:

Level Color
FATAL Red
ERROR Red
WARN Yellow
INFO Green
DEBUG Green
TRACE Green

或者,您可以通過将其作為轉換選項來指定應使用的顔色或樣式。例如,要使文本變為黃色,請使用以下設定:

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

           

支援以下顔色和樣式:

  • blue
  • cyan
  • faint
  • green
  • magenta
  • red
  • yellow

五、檔案輸出

預設情況下,Spring Boot隻記錄到控制台,不寫入日志檔案。如果要在控制台輸出之外寫入日志檔案,則需要設定logging.file.name或logging.file.path屬性(例如,在application.properties中)。

下表顯示了logging.*财産如何一起使用:

表 8.日志記錄屬性

logging.file.name logging.file.path Example Description
(none) (none) 僅控制台日志記錄。
Specific file (none) my.log 寫入指定的日志檔案。 名稱可以是确切的位置,也可以是相對于目前目錄的位置。
(none) Specific directory /var/log 将spring.log寫入指定目錄。名稱可以是确切的位置或相對于目前目錄。

日志檔案在達到10MB時會旋轉,與控制台輸出一樣,預設情況下會記錄ERROR級别、WARN級别和INFO級别的消息。

七、檔案轉換

如果使用Logback,則可以使用application.properties或application.yaml檔案微調日志輪換設定。對于所有其他日志記錄系統,您需要自己直接配置旋轉設定(例如,如果使用Log4j2,則可以添加Log4j2.xml或Log4j2-pring.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)。

八、日志級别

所有支援的日志記錄系統都可以通過使用logging.level.<logger-name>=<level>在Spring環境中設定日志記錄程式級别(例如,在application.properties中),其中級别是TRACE、DEBUG、INFO、WARN、ERROR、FATAL或OFF之一。根日志記錄程式可以通過使用日志記錄.level.root進行配置。

以下示例顯示application.properties中的潛在日志記錄設定:

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

還可以使用環境變量設定日志記錄級别。例如,LOGGING_LEVEL_ORG_SPRINGFRAMEWORK_WEB=DEBUG将ORG.SPRINGFRAMEWORK.WEB設定為DEBUG。

上述方法僅适用于包級日志記錄。由于寬松綁定總是将環境變量轉換為小寫,是以不可能以這種方式為單個類配置日志記錄。如果需要為類配置日志記錄,可以使用SPRING_APPLICATION_JSON變量。

九、日志組

能夠将相關的記錄器分組在一起,以便可以同時配置它們,這通常很有用。例如,您可能通常會更改所有Tomcat相關記錄器的日志記錄級别,但您不容易記住頂級包。

為了幫助實作這一點,Spring Boot允許您在Spring環境中定義日志組。例如,以下是如何通過将“tomcat”組添加到您的application.properties:

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

定義後,您可以使用單行更改組中所有記錄器的級别:

logging.level.tomcat=trace
           

Spring Boot包括以下預定義的日志記錄組,可以立即使用:

Name Loggers
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, org.jooq.tools.LoggerListener

十、使用日志關閉鈎子

為了在應用程式終止時釋放日志資源,提供了一個在JVM退出時觸發日志系統清理的關閉挂鈎。除非将應用程式部署為war檔案,否則會自動注冊此關閉挂鈎。如果應用程式具有複雜的上下文層次結構,則關閉挂鈎可能無法滿足您的需要。如果沒有,請禁用關機挂鈎并調查底層日志系統直接提供的選項。例如,Logback提供了上下文選擇器,允許在自己的上下文中建立每個Logger。您可以使用logging.register-shutdown-hook屬性禁用關機挂鈎。将其設定為false将禁用注冊。您可以在application.properties或application.yaml檔案中設定屬性:

logging.register-shutdown-hook=false
           

十一、自定義日志配置

可以通過在類路徑中包含适當的庫來激活各種日志記錄系統,并且可以通過在路徑的根目錄中或在以下Spring Environment屬性指定的位置提供适當的配置檔案來進一步定制:logging.config。

通過使用org.springframework.Boot.logging.LoggingSystem系統屬性,可以強制Spring Boot使用特定的日志記錄系統。該值應該是LoggingSystem實作的完全限定類名。您還可以使用值none完全禁用Spring Boot的日志記錄配置。

根據您的日志記錄系統,将加載以下檔案:

Logging System Customization
Logback logback-spring.xml, logback-spring.groovy, logback.xml, or logback.groovy
Log4j2 log4j2-spring.xml or log4j2.xml
JDK (Java Util Logging) logging.properties

為了幫助定制,一些其他财産從Spring環境傳輸到系統财産,如下表所述:

Spring Environment System Property Comments
logging.exception-conversion-word LOG_EXCEPTION_CONVERSION_WORD The conversion word used when logging exceptions.
logging.file.name LOG_FILE If defined, it is used in the default log configuration.
logging.file.path LOG_PATH If defined, it is used in the default log configuration.
logging.pattern.console CONSOLE_LOG_PATTERN The log pattern to use on the console (stdout).
logging.pattern.dateformat LOG_DATEFORMAT_PATTERN Appender pattern for log date format.
logging.charset.console CONSOLE_LOG_CHARSET The charset to use for console logging.
logging.pattern.file FILE_LOG_PATTERN The log pattern to use in a file (if LOG_FILE is enabled).
logging.charset.file FILE_LOG_CHARSET The charset to use for file logging (if LOG_FILE is enabled).
logging.pattern.level LOG_LEVEL_PATTERN The format to use when rendering the log level (default %5p).
PID PID The current process ID (discovered if possible and when not already defined as an OS environment variable).

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

Spring Environment System Property Comments
logging.logback.rollingpolicy.file-name-pattern LOGBACK_ROLLINGPOLICY_FILE_NAME_PATTERN Pattern for rolled-over log file names (default ${LOG_FILE}.%d{yyyy-MM-dd}.%i.gz).
logging.logback.rollingpolicy.clean-history-on-start LOGBACK_ROLLINGPOLICY_CLEAN_HISTORY_ON_START Whether to clean the archive log files on startup.
logging.logback.rollingpolicy.max-file-size LOGBACK_ROLLINGPOLICY_MAX_FILE_SIZE Maximum log file size.
logging.logback.rollingpolicy.total-size-cap LOGBACK_ROLLINGPOLICY_TOTAL_SIZE_CAP Total size of log backups to be kept.
logging.logback.rollingpolicy.max-history LOGBACK_ROLLINGPOLICY_MAX_HISTORY Maximum number of archive log files to keep

所有受支援的日志記錄系統在解析其配置檔案時都可以參考System财産。有關示例,請參見spring-bot.jar中的預設配置:

  • Logback
  • Log4j 2
  • Java Util logging

大家好,我是Doker品牌的Sinbad,歡迎點贊和評論,您的鼓勵是我們持續更新的動力!更多資料請前往官網:Doker 多克