4.4。日志
Spring Boot使用Commons Logging
進行所有內部日志記錄,但是使底層日志實現打開狀態。為Java Util Logging
,Log4J2
和Logback
提供了默認配置。在每種情況下,記錄器都已預先配置為使用控制台輸出,同時還提供可選文件輸出。
默認情況下,如果使用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.name
或logging.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
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)