# 26\. 日志
Spring Boot使用[Commons Logging](https://commons.apache.org/logging)進行所有內部日志記錄,但使基礎日志實現開放。 默認配置提供了[Java Util Logging](https://docs.oracle.com/javase/7/docs/api/java/util/logging/package-summary.html),[Log4J2](https://logging.apache.org/log4j/2.x/)和[Logback](http://logback.qos.ch/)。 在每種情況下,記錄器都預先配置為使用控制臺輸出和可選文件輸出都可用。
默認情況下,如果使用'Starters',將會使用Logback。 還包括適當的Logback路由,以確保使用Java Util Logging,Commons Logging,Log4J或SLF4J的依賴庫都能正常工作。
> 有很多可用于Java的日志記錄框架。 如果上面的列表看起來很混亂,別擔心。 一般來說,您不需要更改日志依賴關系,并且Spring Boot默認值將正常工作。
### [](file:///C:/Users/geekidentity/AppData/Local/Youdao/YNote/markdown/index.html#261-日志格式)26.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。
* ---分隔符來區分實際日志消息的開始。
* 線程名稱 - 括在方括號中(可能會截斷控制臺輸出)。
* 記錄器名稱 - 這通常是源類名(通常縮寫)。
* 日志消息。
> Logback沒有FATAL級別(對映ERROR)
### [](file:///C:/Users/geekidentity/AppData/Local/Youdao/YNote/markdown/index.html#262-控制臺輸出)26.2 控制臺輸出
默認的日志配置會在控制臺顯示消息。 默認情況下會記錄ERROR,WARN和INFO級別的消息。 您還可以通過--debug啟動您的應用程序來啟用“debug”模式。
```
$ java -jar myapp.jar --debug
```
> 您還可以在application.properties中指定debug=true。
當啟用debug模式時,配置核心記錄器(嵌入式容器,Hibernate和Spring Boot)的選擇可以輸出更多信息。 啟用debug 模式不會將應用程序配置為使用DEBUG級別記錄所有消息。
或者,您可以使用--trace啟動應用程序(或在您的application.properties中為trace=true)啟用“trace”模式。 這將為核心記錄器(嵌入式容器,Hibernate模式生成和整個Spring組合)啟用trace日志。
#### [](file:///C:/Users/geekidentity/AppData/Local/Youdao/YNote/markdown/index.html#2621-日志顏色輸出)26.2.1 日志顏色輸出
如果您的終端支持ANSI,顏色輸出可以增加可讀性。 您可以將spring.output.ansi.enabled設置為[支持的值](http://docs.spring.io/spring-boot/docs/1.5.2.RELEASE/api/org/springframework/boot/ansi/AnsiOutput.Enabled.html)來覆蓋自動檢測。
使用%clr關鍵字配置顏色編碼。 在最簡單的形式下,轉換器將根據日志級別對輸出進行著色,例如:
```
%clr(%5p)
```
日志級別映射到顏色如下:
* blue
* cyan
* faint
* green
* magenta
* red
* yellow
### [](file:///C:/Users/geekidentity/AppData/Local/Youdao/YNote/markdown/index.html#263-文件輸出)26.3 文件輸出
默認情況下,Spring Boot將僅將日志輸出到控制臺,不會寫到文件。 如果要將控制臺上的日志輸出到日志文件,則需要設置logging.file或logging.path屬性(例如在application.properties中)。
下表顯示了如何一起使用logging.*屬性:
表26.1 Logging屬性
| logging.file | logging.path | Example | Description |
| --- | --- | --- | --- |
| (none) | (none) | ? | 僅控制臺輸出 |
| Specific file | (none) | my.log | 寫入指定的日志文件。 名稱可以是確切的位置或相對于當前目錄。 |
| (none) | Specific directory | /var/log | 將spring.log寫入指定的目錄。 名稱可以是確切的位置或相對于當前目錄。 |
日志文件將在10 MB時滾動輸出到文件,默認情況下會記錄控制臺輸出,ERROR,WARN和INFO級別的消息。
> 日志記錄系統在應用程序生命周期早期初始化,并且在通過@PropertySource注解加載的屬性文件中將不會找到log屬性[。](http://note.youdao.com/)
> 日志屬性獨立于實際的日志記錄基礎結構。 因此,特定配置key(如Logback的logback.configurationFile)不受Spring Boot管理。
### [](file:///C:/Users/geekidentity/AppData/Local/Youdao/YNote/markdown/index.html#264-日志級別)26.4 日志級別
所有支持的日志記錄系統都可以在Spring Environment 中設置log級別(例如在application.properties中),使用‘logging.level.*=LEVEL’,其中'LEVEL'是TRACE,DEBUG,INFO,WARN,ERROR,FATAL, OFF之一。 可以使用logging.level.root配置根記錄器。 示例application.properties:
```
logging.level.root=WARN
logging.level.org.springframework.web=DEBUG
logging.level.org.hibernate=ERROR
```
> 默認情況下,Spring Boot會重新啟動Thymeleaf INFO消息,以便它們以DEBUG級別進行記錄。 這有助于降低標準日志輸出中的噪音。 有關如何在自己的配置中應用重映射的詳細信息,請參閱[LevelRemappingAppender](https://github.com/spring-projects/spring-boot/tree/v1.5.2.RELEASE/spring-boot/src/main/java/org/springframework/boot/logging/logback/LevelRemappingAppender.java)。
### [](file:///C:/Users/geekidentity/AppData/Local/Youdao/YNote/markdown/index.html#265-自定義日志配置)26.5 自定義日志配置
可以通過在類路徑中包含適當的庫來激活各種日志系統,并通過在類路徑的根目錄中提供合適的配置文件,或在Spring Environment屬性logging.config指定的位置進一步配置。
您可以使用org.springframework.boot.logging.LoggingSystem系統屬性強制Spring Boot使用特定的日志記錄系統。該值應該是LoggingSystem實現的全名。 您還可以使用`none`值完全禁用Spring Boot的日志記錄配置。
> 由于在創建ApplicationContext之前初始化日志,因此無法在Spring @Configuration文件中控制@PropertySources的日志記錄。 系統屬性和常規的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變體進行日志記錄配置(例如使用logback-spring.xml而不是logback.xml)。 如果使用標準配置位置,則Spring無法完全控制日志初始化。
> Java Util Logging存在已知的類加載問題,從“可執行jar”運行時會導致問題。 我們建議您盡可能避免。
幫助定制一些其他屬性從Spring環境轉移到系統屬性:
| Spring Environment | System Property | Comments |
| --- | --- | --- |
| logging.exception-conversion-word | LOG_EXCEPTION_CONVERSION_WORD | 記錄異常時使用的轉換字。 |
| logging.file | LOG_FILE | 如果定義了,則用于默認日志配置。 |
| logging.path | LOG_PATH | 如果定義了,則用于默認日志配置。 |
| logging.pattern.console | CONSOLE_LOG_PATTERN | 在控制臺上使用的日志模式(stdout)。 (僅支持默認logback設置。) |
| logging.pattern.file | FILE_LOG_PATTERN | 在文件中使用的日志模式(如果LOG_FILE已啟用)。 (僅支持默認logback設置。) |
| logging.pattern.level | LOG_LEVEL_PATTERN | 用于呈現日志級別的格式(默認%5p)。 (僅支持默認logback設置。) |
| PID | PID | 當前進程ID(如果可能的話,當未被定義為OS環境變量時被發現)。 |
支持的所有日志記錄系統在分析其配置文件時可以查看系統屬性。 有關示例,請參閱spring-boot.jar中的默認配置。
> 如果要在logging屬性中使用占位符,則應使[用Spring Boot的語法](http://docs.spring.io/spring-boot/docs/1.5.2.RELEASE/reference/htmlsingle/#boot-features-external-config-placeholders-in-properties),而不是底層框架的語法。 值得注意的是,如果您使用Logback,您應該使用:作為屬性名稱與其默認值之間的分隔符,而不是`:-`。
> 您可以通過覆蓋LOG_LEVEL_PATTERN(或Logback的log.pattern.level)來添加MDC和其他ad-hoc內容到日志行。 例如,如果使用logging.pattern.level = user:%X {user}%5p,則默認日志格式將包含“user”的MDC條目(如果存在)。
```
2015-09-30 12:30:04.031 user:juergen INFO 22174 --- [ nio-8080-exec-0] demo.Controller
Handling authenticated request
```
### [](file:///C:/Users/geekidentity/AppData/Local/Youdao/YNote/markdown/index.html#266-logback擴展)26.6 Logback擴展
Spring Boot包括大量的Logback擴展,可以幫助您進行高級配置。 您可以在logback-spring.xml配置文件中使用這些擴展。
> 您不能在標準logback.xml配置文件中使用擴展名,因為其加載時間太早。 您需要使用logback-spring.xml或定義logging.config屬性。
> 擴展名不能與Logback的[配置掃描](http://logback.qos.ch/manual/configuration.html#autoScan)一起使用。 如果您嘗試這樣做,對配置文件進行更改將導致類似于以下記錄之一的錯誤:
```
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]]
```
#### [](file:///C:/Users/geekidentity/AppData/Local/Youdao/YNote/markdown/index.html#2661-指定配置文件配置)26.6.1 指定配置文件配置
`<springProfile>`標簽允許您根據活動的Spring配置文件可選地包含或排除配置部分。 配置文件部分支持`<configuration>`元素在任何位置。 使用name屬性指定哪個配置文件接受配置。 可以使用逗號分隔列表指定多個配置文件。
```
<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>
```
#### [](file:///C:/Users/geekidentity/AppData/Local/Youdao/YNote/markdown/index.html#2662-環境屬性)26.6.2 環境屬性
<springProperty>標簽允許您從Spring環境中顯示屬性,以便在Logback中使用。 如果您在logback中訪問application.properties文件中的值,這將非常有用。 標簽的工作方式與Logback標準的<property>標簽類似,但不是指定直接值,而是指定屬性的來源(來自Environment)。 如果需要將屬性存儲在本地范圍以外的位置,則可以使用scope屬性。 如果在環境中未設置屬性的情況下需要備用值,則可以使用defaultValue屬性。
```
<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>
```
RelaxedPropertyResolver用于訪問Environment屬性。 如果以虛線表示法(my-property-name)指定源,則將嘗試所有寬松的變體(myPropertyName,MY_PROPERTY_NAME等)。
- Part I. Spring Boot 文檔
- Part II. 入門指南
- 8. Spring Boot 介紹
- 9. 系統要求
- 10. 安裝 Spring Boot
- 11. 開發您的第一個Spring Boot應用程序
- 12. 接下來應該讀什么
- Part III. 使用 Spring Boot
- 13. 構建系統
- 14. 構建代碼
- 15. 配置類
- 16. 自動配置
- 17. Spring Beans 和 依賴注入
- 18. 使用@SpringBootApplication注解
- 19. 運行你的應用程序
- 20. 開發工具
- 21. 包裝您的應用程序到生產環境
- 22. 接下來應該讀什么
- Part IV. Spring Boot 功能
- 23. SpringApplication
- 24. 外部配置
- 25. 配置文件(Profiles)
- 26. 日志
- 27. 開發Web應用程序
- 28. Security
- 29. 使用SQL數據庫