vlambda博客
学习文章列表

学完本篇不要再说你不会logback

一 前言

logback是一个成熟的log4j 工程,由 Ceki Gülcü 所创造,也是 log4j 日志框架的创建者;

springboot 默认使用的日志框架是logback,其由三个组件组成

  • logback-core

  • logback-classic

  • logback-access

logback-spring.xml 文件放在classpath (resource目录)下 即可自动加载

二logback 基本属性

 
   
   
 
  1. <configuration debug="true">


  2. <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">

  3. <!-- encoders are by default assigned the type

  4. ch.qos.logback.classic.encoder.PatternLayoutEncoder -->

  5. <encoder>

  6. <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>

  7. </encoder>

  8. </appender>


  9. <root level="debug">

  10. <appender-ref ref="STDOUT" />

  11. </root>

  12. </configuration>

日志格式说明

  1. %d 表示日期时间

  2. %thread表示线程名

  3. %-5level:级别从左显示5个字符宽度

  4. Logger :通常使用源代码的类名

  5. %msg:日志消息

  6. %n是换行符

有效的日志级别如下

level of request p






TRACE DEBUG INFO WARN ERROR OFF
TRACE YES NO NO NO NO NO
DEBUG YES YES NO NO NO NO
INFO YES YES YES NO NO NO
WARN YES YES YES YES NO NO
ERROR YES YES YES YES YES NO

2.1 configuration 标签属性

  • scan : 配置文件如果发生改变,将会被重新加载,默认值为true

 
   
   
 
  1. <configuration debug="true">

  2. ...

  3. </configuration>

  • debug: 实时查看logback运行状态,默认值为false

 
   
   
 
  1. <configuration scan="true">

  2. ...

  3. </configuration>

  • scanPeriod: 监测配置文件是否有修改的时间间隔, 默认 每分钟;读者可以设置 示例 30seconds30minutes3hours

 
   
   
 
  1. <configuration scan="true" scanPeriod="30 seconds" >

  2. ...

  3. </configuration>

  • packagingData : 堆栈跟踪中是否启用打包数据,默认false;

 
   
   
 
  1. <configuration packagingData="true">

  2. ...

  3. </configuration>

2.2 statusListener 标签

statusListener 为configuration 的子元素。称为状态监听器,在 configuration 的子标签顶层,意指监听事件;

 
   
   
 
  1. <configuration>

  2. <statusListener class="ch.qos.logback.core.status.OnConsoleStatusListener" />


  3. ... the rest of the configuration file

  4. </configuration>

2.3 property标签

属性 name , value 用来定义变量的 名称 和值 ,在上下文中可以通过 ${name} 的方式进行调用

 
   
   
 
  1. <configuration>


  2. <property name="USER_HOME" value="/home/sebastien" />


  3. <appender name="FILE" class="ch.qos.logback.core.FileAppender">

  4. <file>${USER_HOME}/myApp.log</file>

  5. <encoder>

  6. <pattern>%msg%n</pattern>

  7. </encoder>

  8. </appender>


  9. <root level="debug">

  10. <appender-ref ref="FILE" />

  11. </root>

  12. </configuration>

如果 定义如下示例会去 variables1.properties 中读取配置信息

 
   
   
 
  1. <configuration>


  2. <property file="src/main/java/chapters/configuration/variables1.properties" />


  3. <appender name="FILE" class="ch.qos.logback.core.FileAppender">

  4. <file>${USER_HOME}/myApp.log</file>

  5. <encoder>

  6. <pattern>%msg%n</pattern>

  7. </encoder>

  8. </appender>


  9. <root level="debug">

  10. <appender-ref ref="FILE" />

  11. </root>

  12. </configuration>

variables1.properties:

 
   
   
 
  1. USER_HOME=/home/sebastien

2.4appender标签

appender 为configuration 的子元素,每个 appender 都是一个日志组件, 可以定义一种类型的日志;

  • name :appender 的名称,该值主要用于 ref

  • class:定义appender 组件。

  • scope:指定作用域 ; LOCALCONTEXTSYSTEM

如下示例 :定义2 个组件, 一个是文件存储,一个控制输出,通过 root 标签引用即可同时生效;

 
   
   
 
  1. <configuration>


  2. <appender name="FILE" class="ch.qos.logback.core.FileAppender">

  3. <file>myApp.log</file>


  4. <encoder>

  5. <pattern>%date %level [%thread] %logger{10} [%file:%line] %msg%n</pattern>

  6. </encoder>

  7. </appender>


  8. <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">

  9. <encoder>

  10. <pattern>%msg%n</pattern>

  11. </encoder>

  12. </appender>


  13. <root level="debug">

  14. <appender-ref ref="FILE" />

  15. <appender-ref ref="STDOUT" />

  16. </root>

  17. </configuration>

2.5contextName标签

contextNameconfiguration 的子元素。每一个logger 都可以绑定一个 contextName,默认上下文名称为 default , 如果设定完成,则不能改变;

 
   
   
 
  1. <configuration>

  2. <contextName>myAppName</contextName>

  3. <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">

  4. <encoder>

  5. <pattern>%d %contextName [%t] %level %logger{36} - %msg%n</pattern>

  6. </encoder>

  7. </appender>


  8. <root level="debug">

  9. <appender-ref ref="STDOUT" />

  10. </root>

  11. </configuration>

2.6 logger标签

用来设置某个包或及具体的某个类的日志输出以及指定 <appender>; name 属性一个, level,addtivity(是否向上级loger传递打印信息) 属性可选

如下所示,不想看见包chapters.configuration 中的debug级别日志,可以进行如下配置

 
   
   
 
  1. <configuration>


  2. <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">

  3. <!-- encoders are assigned the type

  4. ch.qos.logback.classic.encoder.PatternLayoutEncoder by default -->

  5. <encoder>

  6. <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>

  7. </encoder>

  8. </appender>


  9. <logger name="chapters.configuration" level="INFO"/>


  10. <!-- Strictly speaking, the level attribute is not necessary since -->

  11. <!-- the level of the root level is set to DEBUG by default. -->

  12. <root level="DEBUG">

  13. <appender-ref ref="STDOUT" />

  14. </root>


  15. </configuration>

打印如下

 
   
   
 
  1. 17:34:07.578 [main] INFO chapters.configuration.MyApp3 - Entering application.

  2. 17:34:07.578 [main] INFO chapters.configuration.MyApp3 - Exiting application.

2.7 root 标签

root标签实质是 <logger>标签,不过其是根标签;若 <logger><appender> 标签为设置输出级别时就会默认继承该标签设置的级别!

 
   
   
 
  1. <!-- 日志输出级别 -->

  2. <root level="INFO">

  3. <appender-ref ref="STDOUT" />

  4. <appender-ref ref="FILE" />

  5. </root>

2.8 include标签

包含其它文件的配置信息

 
   
   
 
  1. <configuration>

  2. <include file="src/main/java/chapters/configuration/includedConfig.xml"/>


  3. <root level="DEBUG">

  4. <appender-ref ref="includedConsole" />

  5. </root>


  6. </configuration>

includedConfig.xml 示例,必须包含 <included>标签

 
   
   
 
  1. <included>

  2. <appender name="includedConsole" class="ch.qos.logback.core.ConsoleAppender">

  3. <encoder>

  4. <pattern>"%d - %m%n"</pattern>

  5. </encoder>

  6. </appender>

  7. </included>

如过是URL

 
   
   
 
  1. <include url="http://some.host.com/includedConfig.xml"/>

三 多环境配置

为了支持 development, testing 和 production 多环境下logback 不冲突的问题,可以使用 <if> , then 进行配置,使目标环境生效;

格式如下

 
   
   
 
  1. <!-- if-then form -->

  2. <if condition="some conditional expression">

  3. <then>

  4. ...

  5. </then>

  6. </if>


  7. <!-- if-then-else form -->

  8. <if condition="some conditional expression">

  9. <then>

  10. ...

  11. </then>

  12. <else>

  13. ...

  14. </else>

  15. </if>

四 示例

4.1正常日志appender示例

 
   
   
 
  1. <!-- 日志 appender :按照每天生成日志文件 -->

  2. <appender name="NORMAL-FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">

  3. <append>true</append>

  4. <!-- 日志名称 -->

  5. <file>${logging.path}/zszxz-boot/zszxz-error.log</file>

  6. <!-- 每天生成一个日志文件,保存30天的日志文件 -->

  7. <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">

  8. <!--日志文件输出的文件名:按天回滚 daily -->

  9. <FileNamePattern>${logging.path}/zszxz-boot/zszxz.log.%d{yyyy-MM-dd}</FileNamePattern>

  10. <!--日志文件保留天数-->

  11. <MaxHistory>30</MaxHistory>

  12. </rollingPolicy>

  13. <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">

  14. <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->

  15. <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>

  16. <!-- 编码 -->

  17. <charset>UTF-8</charset>

  18. </encoder>

  19. </appender>

4.2错误日志appender示例

 
   
   
 
  1. <!-- 错误日志 appender :按照每天生成日志文件 -->

  2. <appender name="ERROR-FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">

  3. <append>true</append>

  4. <!-- 过滤器,只记录 error 级别的日志 -->

  5. <filter class="ch.qos.logback.classic.filter.ThresholdFilter">

  6. <level>error</level>

  7. </filter>

  8. <!-- 日志名称 -->

  9. <file>${logging.path}/zszxz-boot/zszxz-error.log</file>

  10. <!-- 每天生成一个日志文件,保存30天的日志文件 -->

  11. <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">

  12. <!--日志文件输出的文件名:按天回滚 daily -->

  13. <FileNamePattern>${logging.path}/zszxz-boot/zszxz-error.log.%d{yyyy-MM-dd}</FileNamePattern>

  14. <!--日志文件保留天数-->

  15. <MaxHistory>30</MaxHistory>

  16. </rollingPolicy>

  17. <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">

  18. <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->

  19. <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>

  20. <!-- 编码 -->

  21. <charset>UTF-8</charset>

  22. </encoder>

  23. </appender>

五 官方文档

更多的日志配置内容请参照官方文档

http://logback.qos.ch/manual/index.html