20191112 Spring Boot官方文檔學習(4.4)


4.4。日志

Spring Boot使用Commons Logging進行所有內部日志記錄,但是使底層日志實現打開狀態。為Java Util LoggingLog4J2Logback提供了默認配置。在每種情況下,記錄器都已預先配置為使用控制台輸出,同時還提供可選文件輸出。

默認情況下,如果使用Starters,則使用Logback進行日志記錄。還包括適當的Logback路由,以確保使用Java Util Logging,Commons Logging,Log4J或SLF4J的從屬庫都可以正常工作。

4.4.1。日志格式

Spring Boot的默認日志輸出類似於以下示例:

2019-11-11 11:51:57.697  INFO 16640 --- [           main] study.hwj.springboot.MyApplication       : The following profiles are active: dev
2019-11-11 11:51:58.910  INFO 16640 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port(s): 8080 (http)
  • 日期和時間:毫秒精度,易於排序。
  • 日志級別:ERROR,WARN,INFO,DEBUG,或TRACE。
  • 進程ID。
  • --- 分隔符來區分實際日志消息的開始。
  • 線程名稱:用方括號括起來(對於控制台輸出可能會被截斷)。
  • Logger名稱:這通常是源類名稱(通常縮寫)。
  • 日志消息。

Logback沒有FATAL級別。它被映射到ERROR。

4.4.2。控制台輸出

默認日志配置在消息寫入時將消息回顯到控制台。默認情況下,將記錄ERROR,WARN和INFO級別的消息。您還可以通過使用--debug標志啟動應用程序來啟用“調試”模式。

顏色編碼輸出

如果您的終端支持ANSI,則使用彩色輸出來提高可讀性。您可以設置spring.output.ansi.enabled以覆蓋自動檢測。

通過使用%clr轉換字來配置顏色編碼。最簡單的轉換示例所示:

%clr(%5p)

下表描述了日志級別到顏色的映射:

日志級別 顏色
FATAL 紅色
ERROR 紅色
WARN 黃色
INFO 綠色
DEBUG 綠色
TRACE 綠色

可以通過將其提供為轉換的選項來指定應使用的顏色或樣式。例如,要使文本變黃,請使用以下設置:

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

支持以下顏色和樣式:

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

4.4.3。文件輸出

默認情況下,Spring Boot僅記錄到控制台,不寫日志文件。如果除了控制台輸出外還想寫日志文件,則需要設置一個logging.file.namelogging.file.path屬性(例如,在application.properties中)。

日志記錄屬性:

logging.file.name logging.file.path 示例 描述
(沒有) (沒有) 僅控制台記錄。
特定文件 (沒有) my.log 寫入指定的日志文件。名稱可以是確切位置,也可以是相對於當前目錄的位置。
(沒有) 具體目錄 /var/log 寫入spring.log指定的目錄。名稱可以是確切位置,也可以是相對於當前目錄的位置。

日志文件達到10 MB時會旋轉,並且與控制台輸出一樣,默認情況下會記錄ERROR,WARN和INFO消息。可以使用logging.file.max-size屬性更改大小限制。除非已設置logging.file.max-history屬性,否則以前旋轉的文件將無限期存檔。日志檔案的總大小可以使用logging.file.total-size-cap設置上限。當日志歸檔的總大小超過該閾值時,將刪除備份。要在應用程序啟動時強制清除日志存檔,請使用logging.file.clean-history-on-start屬性。

日志記錄屬性獨立於實際的日志記錄基礎結構。結果,Spring Boot不會管理特定的配置鍵(例如Logback的logback.configurationFile)。

4.4.4。日志級別

所有支持的日志系統可以在Spring Environment設置日志級別(例如,通過使用application.properties),logging.level.<logger-name>=<level>,其中level為TRACE,DEBUG,INFO,WARN,ERROR,FATAL或OFF之一。root Logger可以通過使用logging.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變量。

4.4.5。日志組

能夠將相關記錄器分組在一起通常很有用,以便可以同時配置它們。例如,您可能通常會更改所有與Tomcat相關的記錄器的記錄級別,但是您不容易記住頂層軟件包。

為了解決這個問題,Spring Boot允許您在Spring Environment中定義日志記錄組。例如,這是通過將“ tomcat”組添加到您的方式來定義它的方法application.properties:

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

定義后,您可以使用一行配置更改該組中所有記錄器的級別:

logging.level.tomcat=TRACE

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

名稱 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

4.4.6。自定義日志配置

可以通過在類路徑中包含適當的庫來激活各種日志記錄系統,並可以通過在類路徑的根目錄或Spring Environment屬性logging.config指定的位置中提供適當的配置文件來進一步自定義各種日志記錄系統。

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

-Dorg.springframework.boot.logging.LoggingSystem=none

由於日志記錄是在ApplicationContext創建之前初始化的,因此無法從Spring @Configuration文件中控制@PropertySources的日志記錄。更改日志記錄系統或完全禁用它的唯一方法是通過系統屬性。

根據不同的日志系統加載不同的配置文件: 日志系統 | 日志系統配置文件 ---|--- 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 變體用於日志記錄配置(例如,logback-spring.xml而不是logback.xml)。如果使用標准配置位置,Spring將無法完全控制日志初始化。

從“可執行jar”運行時,Java Util Logging存在一些已知的類加載問題,這些問題會引起問題。我們建議您盡可能從“可執行jar”運行時避免使用它。

為了幫助進行自定義,如下表所述,一些在Spring Environment中的屬性也可以在System屬性中配置:

Spring Environment System Property 備注
logging.exception-conversion-word LOG_EXCEPTION_CONVERSION_WORD 記錄異常時使用的轉換字。
logging.file.clean-history-on-start LOG_FILE_CLEAN_HISTORY_ON_START 是否在啟動時清除存檔日志文件(如果啟用了LOG_FILE)。(僅默認的Logback設置受支持。)
logging.file.name LOG_FILE 如果定義,它將在默認日志配置中使用。
logging.file.max-size LOG_FILE_MAX_SIZE 最大日志文件大小(如果啟用了LOG_FILE)。(僅默認的Logback設置受支持。)
logging.file.max-history LOG_FILE_MAX_HISTORY 要保留的最大歸檔日志文件數(如果啟用了LOG_FILE)。(僅默認的Logback設置受支持。)
logging.file.path LOG_PATH 如果定義,它將在默認日志配置中使用。
logging.file.total-size-cap LOG_FILE_TOTAL_SIZE_CAP 要保留的日志備份的總大小(如果啟用了LOG_FILE)。(僅默認的Logback設置受支持。)
logging.pattern.console CONSOLE_LOG_PATTERN 控制台上使用的日志模式(stdout)。(僅默認的Logback設置受支持。)
logging.pattern.dateformat LOG_DATEFORMAT_PATTERN 記錄日期格式的附加模式。(僅默認的Logback設置受支持。)
logging.pattern.file FILE_LOG_PATTERN 文件中使用的日志模式(如果LOG_FILE已啟用)。(僅默認的Logback設置受支持。)
logging.pattern.level LOG_LEVEL_PATTERN 呈現日志級別時使用的格式(默認%5p)。(僅默認的Logback設置受支持。)
logging.pattern.rolling-file-name ROLLING_FILE_NAME_PATTERN 過渡日志文件名的模式(默認$.%d.%i.gz)。(僅默認的Logback設置受支持。)
PID PID 當前進程ID(如果可能,並且尚未將其定義為OS環境變量時,將被發現)。

所有受支持的日志記錄系統在解析其配置文件時都可以使用系統屬性。有關示例,請參見spring-boot.jar中的默認配置:

  • Logback
  • Log4j 2
  • Java Util logging

如果要在日志記錄屬性中使用占位符,則應使用Spring Boot的語法而不是基礎框架的語法。值得注意的是,如果您使用Logback,則應將 : 用作屬性名稱與其默認值之間的分隔符,而不應使用 :-

您可以通過僅覆蓋LOG_LEVEL_PATTERN(或使用Logback的logging.pattern.level)將MDC和其他臨時內容添加到日志行。例如,如果使用logging.pattern.level=user:%X{user} %5p,則默認日志格式包含“ user”的MDC條目(如果存在),如以下示例所示。

2019-11-11 15:38:24.830 requestId:c60b9602-d273-4173-8ca2-2a3f2f2b438d  INFO 1980 --- [nio-8080-exec-1] study.hwj.springboot.MyController        : MyController...ttttt

MDC使用參考

4.4.7。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]]

特定於Profile的配置

使用<springProfile>標簽,您可以根據激活的Spring Profiles選擇包括或排除配置部分。Profile部分在<configuration>標簽內的任何位置都受支持。使用name屬性指定哪個 Profile 接受配置。<springProfile>標簽可包含一個簡單的 Profile 的名稱(例如staging)或 Profile 表達式。Profile 表達式允許表達更復雜的 Profile 邏輯,例如production & (eu-central | eu-west)。有關更多詳細信息,請參閱參考指南。以下清單顯示了三個樣本 Profiles:

<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屬性。如果需要fallback值(以防未在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屬性必須是短橫線式語法(例如my.property-name)。但是,可以使用寬松規則將屬性添加到Environment中。

Spring Boot日志原理

參考源碼:
使用org.springframework.boot.context.logging.LoggingApplicationListener監聽器監聽多個事件:

ApplicationStartingEvent.class,
ApplicationEnvironmentPreparedEvent.class, 
ApplicationPreparedEvent.class, 
ContextClosedEvent.class,
ApplicationFailedEvent.class

在觸發ApplicationStartingEvent事件時,初始化日志系統,參考org.springframework.boot.logging.LoggingSystem#get(java.lang.ClassLoader)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM