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 会加载对应的日志配置文件:

 
spring boot 特性之 Logging

如果使用 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>

相关推荐