spring boot 特性之 Logging
spring boot 特性之 Logging
【日志格式】
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;
* --- 分隔符,其后为实际的日志信息;
* 线程名称;
* 日志名称:通常是简短的类名;
* 日志内容信息
NOTE: Logback 没有 FATAL 级别的日志,它被当作 ERROR 级别。
【输出到控制台】
默认的日志信息输出在控制台。级别为 ERROR,WARN 和 INFO 的信息会被打印。在启动应用时 加上 --debug 参数可以启动 DEBUG 级别的日志:
$ java -jar myapp.jar --debug
此外,也可以在 application.properties 文件中指定 debug=true 来启用 DEBUG 级别。
当启用 DEBUG 级别日志,一些核心的日志会输出更详细信息,如 Tomcat,Hibernate,SpringBoot 等,但并不会输出所有信息。
当启用 TRACE 级别日志时,输出的信息将会更加详细,除了 DEBUG 输出的内容外,还会输出整个 Spring 框架的信息。
(不同级别的信息输出配置不同颜色)
默认的日志级别配置的颜色如下所示:
* FATAL --- red
* ERROR --- red
* WARN --- yellow
* INFO --- green
* DEBUG --- green
* TRACE --- green
所有支持的颜色为:blue,cyan,faint,green,magenta,red,yellow
如果想要自定义颜色,需要设置 spring.output.ansi.enabled 为 true。
<?xml version="1.0" encoding="UTF-8"?> <configuration debug="false"> <!-- 控制台输出 --> <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <!--%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度 %msg:日志消息,%n:换行符--> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern> </encoder> </appender> <!--myibatis log configure--> <logger name="com.apache.ibatis" level="TRACE"/> <logger name="java.sql.Connection" level="DEBUG"/> <logger name="java.sql.Statement" level="DEBUG"/> <logger name="java.sql.PreparedStatement" level="DEBUG"/> <!-- 日志输出级别 --> <root level="INFO"> <appender-ref ref="STDOUT" /> <appender-ref ref="FILE" /> </root> </configuration>
假如在 logback.xml 中配置如上内容,使用 %clr 转换词配置彩色输出,那么需要将 pattern 标签中的内容替换为:
<!-- 比如 --> %clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(%5p) %clr(${PID}){magenta} %clr(---){faint} %clr(%logger{36}){cyan} %clr(:){faint} %msg%n
【输出到文件】
默认情况下,spring boot 日志仅仅输出到控制台,并不会写出到日志文件。如果想要输出日志文件,那么需要在 application.properties 文件中指定 logging.file 或者 logging.path 的值。
① 指定 logging.file 的值,比如 logging.file=my.log,那么日志将会生成到项目根目录下的 my.log 文件中;
② 指定 logging.path 的值,比如 logging.path=/var/log,那么日志将会生成到 /var/log 目录下的 spring.log 文件中。
注意,如果同时设置了 logging.file 和 logging.path 的值,那么 logging.path 将不会生效!
当日志文件达到 10MB 时,会产生另一个新的日志文件,文件大小的值可以通过 logging.file.max-size 指定。如果没有指定 logging.file.max-history 的值,那么日志文件将被一直保存。
NOTE:由于日志系统初始化早于 application 生命周期,因此无法通过 @PropertySource 注解加载到属性文件中日志的属性值!
【日志等级】
所有 spring boot 所支持的日志系统都可以在 spring 环境中设置日志等级。日志等级可以设置为:TRACE, DEBUG, INFO, WARN, ERROR, FATAL, 或者 OFF。比如:
logging.level.root=WARN logging.level.org.springframework.web=DEBUG logging.level.org.hibernate=ERROR
【自定义日志配置】
可以通过在 classpath 的根目录下设置配置文件或者设置 logging.config 的属性值指定具体配置文件的路径来自定义日志配置。
也可以通过设置 Java 系统属性 org.springframework.boot.logging.LoggingSystem 的值来让 spring boot 使用具体的日志系统,该属性的值为日志系统实现类的全限定名。
如果值设置为 none,会禁用 spring boot 的日志系统。
下列日志 系统,spring boot 会加载对应的日志配置文件:
如果使用 logback 日志系统(默认),推荐将配置文件命名为 logback-spring.xml 或者 logback-spring.groovy 。
【Logback日志扩展】
spring boot 对 Logback 日志做了一些扩展来实现高级配置。不过这些配置需要放在 logback-spring.xml 配置文件中,因为标准的 logback.xml 配置文件加载的时机非常早,所以无法在里面使用扩展内容。
注意,扩展的内容无法和 Logback 配置自动扫描功能同时生效,如果不小心这样做,可能会出现如下异常日志:
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. 特定 Profile 配置
<springProfile> 标签可以选择性的包含或排除那些基于激活的 spring porfiles 的配置片段, 这些 profile 片段只要放置于 <configuration> 标签中即可。使用 name 属性来指定使用的 profile 配置名称,name 中要指定多个 profile 名称的,使用逗号分割:
<springProfile name="staging"> <!-- 当名称为 staging 的 profile 被激活时,本段配置才会生效 --> </springProfile> <springProfile name="dev, staging"> <!-- 当名称为 dev 或 staging 的 profile 被激活时,本段配置才会生效 --> </springProfile> <springProfile name="!production"> <!-- 当名称为 production 的 profile 被未激活时,本段配置才会生效 --> </springProfile>
2. 环境属性
<springProperty> 标签使得在使用 Logback 日志时,可以直接使用 spring 环境中的属性值。比如,在 Logback 的配置中使用 application.properties 文件中的属性值。在 <springProperty> 中使用 source 来指定来自 spring 环境中的属性名称。如果这个引用的值不仅仅在本标签中,可以将 scope 属性值设置为其他(比如 context),如果指定的属性名不在 spring 环境中,那么可以通过 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>