一、logging
Spring Boot使用Commons Logging記錄內部的日志,但是開放了底層日志的接口實現。提供了Java Util Logging,Log4J2和Logback的默認配置。 在每種情況下,記錄器都已預先配置為使用控制台輸出,也可以打印到文件中。
默認情況下,如果使用“starters”,則使用Logback進行日志記錄。 還包括適當的Logback路由,以確保使用Java Util Logging,Commons Logging,Log4J或SLF4J的依賴庫都能正常工作。
Java有許多的日志記錄框架。 如果上面的列表看起來令人困惑,請不要擔心。 通常,您不需要更改日志記錄依賴項,Spring Boot的日志記錄默認就可以工作。
將應用程序部署到servlet容器或應用程序服務器時,通過Java Util Logging API執行的日志記錄不會路由到應用程序的日志中。 這樣可以防止容器或其他已部署到容器中的應用的日志記錄出現在當前部署的應用程序的日志中。
1、日志格式
Spring Boot的默認日志輸出格式如下例:
2019-03-05 10:57:51.112 INFO 45469 --- [ main] org.apache.catalina.core.StandardEngine : Starting Servlet Engine: Apache Tomcat/7.0.52
2019-03-05 10:57:51.253 INFO 45469 --- [ost-startStop-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext
2019-03-05 10:57:51.253 INFO 45469 --- [ost-startStop-1] o.s.web.context.ContextLoader : Root WebApplicationContext: initialization completed in 1358 ms
2019-03-05 10:57:51.698 INFO 45469 --- [ost-startStop-1] o.s.b.c.e.ServletRegistrationBean : Mapping servlet: 'dispatcherServlet' to [/]
2019-03-05 10:57:51.702 INFO 45469 --- [ost-startStop-1] o.s.b.c.embedded.FilterRegistrationBean : Mapping filter: 'hiddenHttpMethodFilter' to: [/*]
下面是輸出項:
- 日期和時間:毫秒精度,易於排序。
- 日志級別:
ERROR,WARN,DEBUG和TRACE - 進程ID。
- 一個
---分隔符,用於區分實際日志消息的開始。 - 線程名稱:用方括號括起來(輸出可能會被控制台截斷)。
- 記錄器名稱:這通常是源類名稱(通常縮寫)。
- 日志消息。
Logback沒有FATAL級別。 它映射到ERROR。
2、控制台輸出
默認日志配置在寫入消息時將消息回顯到控制台。 默認情況下,將記錄ERROR級,WARN級和INFO級消息。 您還可以通過使用--debug標志啟動應用程序來啟用“調試”模式。
$ java -jar myapp.jar --debug
你也可以在application.properties中指定debug=true
啟用調試模式后,將配置一些核心記錄器(嵌入式容器,Hibernate和Spring Boot)以輸出更多信息。 啟用調試模式不會將所有的消息都以DEBUG級別記錄。
另外,您可以通過使用--trace標志(或application.properties中的trace = true)啟動應用程序來啟用“跟蹤”模式。 這樣做可以為某些核心記錄器(嵌入式容器,Hibernate模式生成以及整個Spring產品組合)啟用跟蹤記錄。
1、彩色編碼輸出
如果您的終端支持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 HH:mm:ss.SSS}){yellow}
支持以下顏色和樣式:
bluecyanfaintgreenmagentaredyellow
3、文件輸出
默認情況下,Spring Boot只記錄到控制台,不寫日志文件。 如果除了控制台輸出外還想寫日志文件,則需要設置logging.file.name或logging.file.path屬性(在application.properties中)。
下表顯示了logging.*屬性如何一起使用:
logging.file.name |
logging.file.path |
Example | Description |
|---|---|---|---|
| (none) | (none) | 只記錄在控制台 | |
| Specific file | (none) | my.log |
寫入指定的日志文件。 名稱可以是確切的位置,也可以相對於當前目錄。 |
| (none) | Specific directory | /var/log |
將spring.log寫入指定目錄。 名稱可以是確切的位置,也可以相對於當前目錄。 |
日志文件達到10 MB時會切分,並且與控制台輸出一樣,默認情況下會記錄ERROR級別,WARN級別和INFO級別的消息。 可以使用logging.file.max-size屬性更改大小限制。 除非已設置logging.file.max-history屬性,否則默認情況下將保留最近7天的日志文件。 可以使用logging.file.total-size-cap限制日志歸檔文件的總大小。 當日志歸檔的總大小超過該閾值時,將刪除備份。 要在應用程序啟動時強制清除日志存檔,請使用logging.file.clean-history-on-start屬性。
日志記錄屬性獨立於實際的日志記錄基礎結構。 結果,特定的配置鍵(例如Logback的logback.configurationFile)不是由Spring Boot管理的。
4、日志級別
通過使用logging.level.<logger-name> = <level>,可以在Spring環境中(例如,在application.properties中)設置所有受支持的日志記錄器級別。,其中level是TRACE,DEBUG,INFO, WARN,ERROR,FATAL或OFF。 可以使用logging.level.root配置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變量。
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包含以下預定義的日志記錄組,它們可以直接使用:
| 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 |
6、自定義日志配置
可以通過在類路徑上包含適當的庫來激活各種日志記錄系統,並可以通過在類路徑的根目錄或以下Spring Environment屬性指定的位置中提供適當的配置文件來進一步自定義日志文件:logging.config。
您可以通過使用org.springframework.boot.logging.LoggingSystem系統屬性來強制Spring Boot使用特定的日志記錄系統。 該值應該是LoggingSystem實現的全類名。 您也可以使用none禁用Spring Boot的日志記錄配置。
由於日志記錄是在創建ApplicationContext之前初始化的,因此無法從Spring @Configuration文件中的@PropertySources控制日志記錄。 更改日志記錄系統或完全禁用它的唯一方法是通過系統屬性。
根據您的日志記錄系統,將加載以下文件:
| 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 Boot就會自動使用文件里的日志配置以及相應的日志系統。
建議使用logback-spring.xml格式而不是logback.xml
7、Logback擴展
Spring Boot包含許多Logback擴展,可以幫助進行高級配置。 您可以在logback-spring.xml配置文件中使用這些擴展。
由於標准logback.xml配置文件加載得太早,因此無法在其中使用擴展。 您需要使用logback-spring.xml或定義logging.config屬性。
1、特定配置文件配置
通過<springProfile>標記,您可以根據激活的Spring配置文件有選擇地包括或排除配置部分。 在<configuration>元素內的任何位置都支持配置文件。 使用name屬性指定哪個配置文件接受配置。 <springProfile>標記可以包含簡單的配置文件名稱(例如,staging)或配置文件表達式。 配置文件表達式允許表達更復雜的配置文件邏輯,例如production&(eu-central | eu-west)。 有關更多詳細信息,請參閱參考指南。 以下清單顯示了三個樣本概要文件:
<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>
2、環境屬性
<springProperty>標記使您可以從Spring Environment中公開屬性,以在Logback中使用。 如果要在Logback配置中使用的application.properties文件中的值,則這樣做很有用。 該標簽的工作方式類似於Logback的標准<property>標簽。 但是不是直接指定value,而是指定屬性源(從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(例如my.property-name)。 但是,可以使用松散規則將屬性添加到Environment中。
