# 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数据库