Logging
Spring Boot使用Commons Logging记录所有内部日志,但是底层日志实现处于open状态.为Java Util Logging,Log4j2和Logback提供了默认实现.每种实现,记录器都默认配置为使用控制台输出,还提供了可选的文件输出.
默认情况下,如果使用"starters",logback将用于日志记录. 还包括适当的Logback路由,以确保使用Java Util Logging,Commons Logging,Log4J或SLF4J的依赖库都将正常工作。
有很多日志框架可用于Java。 不要担心,如果上面的列表看起来很混乱。 一般来说,你不需要改变你的日志依赖,Spring Boot默认值将正常工作。
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: [/*]
输出以下项目:
- Date and Time:毫秒精度并且容易排序
- Log Level: ERROR,WARN,INFO,DEBUG或者TRACE
- Process ID
- 一个---分隔符来区分实际日志消息的开始。
- Thread name : 用方括号括起来(可能被截断用于控制台输出)。
- Logger name: 这通常是源类名(通常是缩写)。
- 日志消息。
Logback没有FATAL级别(它映射到ERROR)
26.2 控制台输出
默认日志配置会在写入消息时将消息回显到控制台。 默认情况下,将记录ERROR,WARN和INFO级别消息。 您还可以通过使用--debug标志启动应用程序来启用“调试”模式。
$ java -jar myapp.jar --debug
不还可以在application.properties中指定debug = true。
当调试模式启用时,会选择配置输出更多信息的(嵌入式容器,Hibernate和Spring Boot)核心记录器。启用调试模式不会将应用程序配置为使用DEBUG级别记录所有消息。
你可以通过--trace标志(或在application.properties中添加trace=true)启动应用的"trace"模式.这将启用一些核心记录器的trace日志记录
26.2.1 验收编码输出
如果您的终端支持ANSI,将使用颜色输出来帮助可读性。 您可以将spring.output.ansi.enabled设置为支持的值,以覆盖自动检测。 使用%clr转换字组态颜色编码。 在其最简单的形式中,转换器将根据日志级别对输出进行着色,例如:
%clr(%5p)
日志级别到颜色的映射如下:
Level | 颜色 |
---|---|
FATAL | 红色 |
ERROR | 红色 |
WARN | 黄色 |
INFO | 绿色 |
DEBUG | 绿色 |
TRACE | 绿色 |
可以通过将其作为转换的选项来指定应使用的颜色或样式。 例如,使文本变为黄色:
%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){yellow}
支持以下颜色和样式:
- blue
- cyan
- faint
- green
- magenta
- red
- yellow
26.3 文件输出
默认情况下,Spring Boot只会记录到控制台,不会写入日志文件.如果出了控制台输出之外还要写入日志文件,你需要设置logging.file或者logging.path属性(在application.properties中) 下表显示如何一起使用logging.*属性:
logging.file | loging.path | 例子 | 描述 |
---|---|---|---|
(none) | (none) | 仅zai在控制台记录日志 | |
特定文件 | (none) | my.log | 写入指定的日志文件。 名称可以是绝对路径或相对路径。 |
(none) | 特定目录 | /var/log | 将spring.log写入指定的目录。 名称可以是绝对路径或相对路径。 |
当日志文件内容达到10M时会覆盖,并且默认输出ERRPR.WARN,INFO级别的日志到控制台。
日志系统在应用程序生命周期的早期初始化,因此在通过@PropertySource注解加载的properties文件中将找不到日志属性。 日志记录属性与实际日志记录基础结构无关。 因此,特定配置key(例如Logback的logback.configurationFile)不受spring Boot管理。
26.4
所有支持的日志记录系统都可以使用"logging.level.*=LVEL"在Spring环境中设置记录器(logger)(例如在application.properties中设置),'LEVEL'是TRACE,DEBUG,INFO,ERROR,WARN,OFF,FATAL的其中之一.根记录器可以使用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
26.5 自定义日志配置
可以通过在classpath中添加适当的库来激活各种日志系统,并通过在classpath的根目录或者Spring Environment的logging.config属性指定的位置提供合适的配置文件来进一步定制.
可以通过使用org.springframework.boot.logging.LoggingSystem系统属性来强制Spring Boot使用日志系统.该值应为LoggingSystem实现的全限定类名.还可以通过使用None值来完全禁用Spring Boot的日志记录配置。
因为在创建ApplicationContext之前初始化日志记录,所以不可能从在Spring @Configuration文件中@PropertySource控制日志记录.
根据您的日志记录系统,将加载以下文件: | 日志系统 | 定制 | |--------|--------| | 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日志记录中存在已知的类加载问题,当从“executable jar”运行时会导致问题。 我们建议您尽可能避免。
为了更好的定制,一些其他属性从Spring环境转移到系统属性:
Spring环境 | 系统属性 | 注释 |
---|---|---|
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(如果可能,并且尚未定义为操作系统环境变量时发现)。 |
所有支持的日志系统可以在解析其配置文件时查阅系统属性。 有关示例,请参阅spring-boot.jar中的默认配置。
如果要在日志记录属性中使用占位符,应该使用Spring Boot的语法,而不是底层框架的语法。 值得注意的是,如果您使用Logback,应该使用:作为属性名称和其默认值之间的分隔符,而不是: - 。
您可以通过仅覆盖LOG_LEVEL_PATTERN(或使用Logback的logging.pattern.level)将MDC和其他临时内容添加到日志行。 例如,如果使用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
26.6 Logback拓展
Spring Boot包含多个Logback的扩展,可以帮助进行高级配置。 您可以在logback-spring.xml配置文件中使用这些扩展。
您不能在标准logback.xml配置文件中使用扩展,因为加载得太早。 您需要使用logback-spring.xml或定义logging.config属性。
26.6.1 Profile-specific配置
<springProfile name="staging">
<!-- 当"staging"profile处于激活状态时启用该配置 -->
</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>
26.6.2 环境属性
<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等)。