Spring Boot 參考指南(日志記錄)

作者:博弈
鏈接:segmentfault.com/a/1190000015309366
1. 日志記錄
Spring Boot為所有內(nèi)部日志記錄使用Commons Logging,但開放底層日志實現(xiàn),提供了Java Util Logging、Log4J2和Logback的默認配置,在每種情況下,日志記錄器都被預(yù)先配置為使用控制臺輸出,可選的文件輸出也可用。
默認情況下,如果使用“Starter”,則使用Logback進行日志記錄,還包括適當?shù)腖ogback路由,以確保使用Java Util Logging、Commons Logging、Log4J或SLF4J的依賴庫都能正確工作。
Java有很多日志框架可用,如果上面的列表看起來很混亂,不要擔(dān)心。一般情況下,你不需要更改日志依賴項,Spring Boot缺省值也可以正常工作。
1.1 日志格式
Spring Boot的默認日志輸出類似于以下示例:
2014-03-05?10:57:51.112??INFO?45469?---?[???????????main]?org.apache.catalina.core.StandardEngine??:?Starting?Servlet?Engine:?Apache?Tomcat/7.0.52
2014-03-05?10:57:51.253??INFO?45469?---?[ost-startStop-1]?o.a.c.c.C.[Tomcat].[localhost].[/]???????:?Initializing?Spring?embedded?WebApplicationContext
2014-03-05?10:57:51.253??INFO?45469?---?[ost-startStop-1]?o.s.web.context.ContextLoader????????????:?Root?WebApplicationContext:?initialization?completed?in?1358?ms
2014-03-05?10:57:51.698??INFO?45469?---?[ost-startStop-1]?o.s.b.c.e.ServletRegistrationBean????????:?Mapping?servlet:?'dispatcherServlet'?to?[/]
2014-03-05?10:57:51.702??INFO?45469?---?[ost-startStop-1]?o.s.b.c.embedded.FilterRegistrationBean??:?Mapping?filter:?'hiddenHttpMethodFilter'?to:?[/*]
下面是輸出項:
日期和時間:毫秒精度,易于分類。
日志級別:ERROR、WARN、INFO、DEBUG或TRACE。
進程ID。
---分隔符,用于區(qū)分實際日志消息的開始。
線程名稱:用方括號括起來(可能被截斷用于控制臺輸出)。
記錄器名稱:這通常是源類名稱(通常縮寫)。
日志消息。
Logback沒有FATAL級別,它被映射為ERROR。
1.2 控制臺輸出
默認的日志配置會在消息被寫入時向控制臺回顯,默認情況下,ERROR-級別、WARN-級別和INFO-級別的消息將被記錄下來,還可以通過使用--debug標志啟動應(yīng)用程序來啟用“debug”模式。
$?java?-jar?myapp.jar?--debug
你還可以在application.properties中指定debug=true。
啟用調(diào)試模式時,將配置核心日志記錄器(嵌入式容器、Hibernate和Spring Boot)的選擇,以輸出更多信息,啟用調(diào)試模式不會將應(yīng)用程序配置為使用DEBUG級別記錄所有消息。
或者,你可以啟用“trace”模式,通過使用--trace標志啟動應(yīng)用程序(或在application.properties中trace=true),這樣做可以使trace日志記錄用于選擇核心日志記錄器(嵌入式容器、Hibernate模式生成和整個Spring組合)。
1.2.1 彩色編碼輸出
如果你的終端支持ANSI,則使用顏色輸出來幫助提高可讀性,你可以將spring.output.ansi.enabled設(shè)置為支持的值,以覆蓋自動檢測。
顏色編碼是通過使用%clr轉(zhuǎn)譯符來配置的,在最簡單的形式中,轉(zhuǎn)換器將輸出按照日志級別進行著色,如下面的示例所示:
%clr(%5p)
下表描述了日志級別到顏色的映射:
或者,你也可以通過提供顏色或樣式作為轉(zhuǎn)換的選項來指定應(yīng)該使用的顏色或樣式,例如,要使文本變?yōu)辄S色,請使用以下設(shè)置:
%clr(%d{yyyy-MM-dd?HH:mm:ss.SSS}){yellow}
支持以下顏色和風(fēng)格:
blue?
cyan?
faint
green
magenta?
red?
yellow
1.3 文件輸出
默認情況下,Spring Boot日志只記錄到控制臺,不寫日志文件,如果你想在控制臺輸出之外寫入日志文件,你需要設(shè)置logging.file或logging.path屬性(例如,在你的application.properties中)。
下表顯示了如何將logging.*屬性結(jié)合使用:
表26.1. Logging屬性
日志文件在達到10MB時就會回滾,與控制臺輸出一樣,默認情況下會記錄ERROR-級別、WARN-級別和INFO-級別的消息,可以使用logging.file.max-size屬性更改大小限制,除非logging.file.max-history屬性已被設(shè)置,否則之前回滾的文件將被無限期地歸檔。
日志系統(tǒng)在應(yīng)用程序生命周期的早期初始化,因此,在通過@PropertySource注解加載的屬性文件中沒有發(fā)現(xiàn)日志屬性。日志記錄屬性獨立于實際的日志記錄基礎(chǔ)設(shè)施,因此,特定的配置鍵(例如Logback的logback.configurationFile)不是由spring Boot管理的。
1.4 日志級別
所有受支持的日志系統(tǒng)都可以在Spring Environment中通過使用logging.level.
下面的示例展示了application.properties中可能的日志記錄設(shè)置:
logging.level.root=WARN
logging.level.org.springframework.web=DEBUG
logging.level.org.hibernate=ERROR
1.5 自定義日志配置
可以通過在類路徑中包含適當?shù)膸靵砑せ罡鞣N日志系統(tǒng),還可以通過在類路徑的根目錄中或在以下Spring Environment屬性(logging.config)指定的位置中提供合適的配置文件來進一步定制。
你可以通過使用org.springframework.boot.logging.LoggingSystem來強制Spring Boot使用特定的日志系統(tǒng),值應(yīng)該是LoggingSystem實現(xiàn)的完全限定類名,你還可以完全通過使用none值來禁用Spring Boot的日志配置。
因為日志是在創(chuàng)建ApplicationContext之前初始化的,無法在Spring @Configuration文件中控制來自@PropertySources的logging,更改日志系統(tǒng)或完全禁用日志系統(tǒng)的唯一方法是通過系統(tǒng)屬性。依賴于你的日志系統(tǒng),加載下列文件:

如果可能的話,我們建議你對logging配置使用-spring變體(例如,logback-spring.xml而不是logback.xml),如果使用標準配置位置,Spring不能完全控制日志初始化。
Java Util Logging存在已知的類加載問題,當從“可執(zhí)行jar”運行時,會導(dǎo)致問題,如果可能的話,我們建議你在運行“可執(zhí)行jar”時避免使用它。
為了幫助定制,一些其他屬性從Spring Environment轉(zhuǎn)移到系統(tǒng)屬性,如下表所示:


所有支持的日志系統(tǒng)在解析配置文件時都可以參考系統(tǒng)屬性,在spring-boot.jar中看默認配置的例子:
Logback?
Log4j 2?
Java Util logging
如果希望在logging屬性中使用占位符,你應(yīng)該使用Spring Boot的語法,而不是底層框架的語法,值得注意的是,如果你使用Logback,你應(yīng)該使用:作為屬性名與其默認值之間的分隔符,而不是使用:-。
你可以通過只覆蓋LOG_LEVEL_PATTERN(或使用Logback的logging.pattern.level)來將MDC和其他特殊內(nèi)容添加到日志行中,例如,如果你使用logging.pattern.level=user:%X{user} %5p,然后,默認的日志格式包含“user”的MDC項,如果存在,如下例所示。
2015-09-30?12:30:04.031?user:someone?INFO?22174?---?[??nio-8080-exec-0]?demo.Controller
Handling?authenticated?request
1.6 Logback擴展
Spring Boot包含許多可以幫助進行高級配置的Logback擴展,你可以在你的logback-spring.xml配置文件使用這些擴展。
因為標準logback.xml配置文件過早地加載,不能在其中使用擴展,你需要使用logback-spring.xml或定義logging.config屬性。
不能使用Logback的配置掃描來使用擴展,如果你嘗試這樣做,對配置文件進行更改將導(dǎo)致類似于下面記錄的錯誤之一:
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]]
1.6.1 特殊配置文件配置
通過
"staging">
????
"dev,?staging">
????
"!production">
????
1.6.2 環(huán)境屬性
通過
"context"?name="fluentHost"?source="myapp.fluentd.host"
????????defaultValue="localhost"/>
"FLUENT"?class="ch.qos.logback.more.appenders.DataFluentAppender">
????${fluentHost}
????...
必須在連接符形式中指定source(例如my.property-name),但是,可以使用寬松的規(guī)則將屬性添加到Environment中。
好文章,我在看

