vlambda博客
学习文章列表

日志系列2——logback配置文件详解

1.logback 配置文件的组成

1.1 root节点

  root 节点是必选节点,用来指定最基础的日志输出级别,只有一个 level 属性,用于设置打印级别,可选如下:TRACE,DEBUG,INFO,WARN,ERROR,ALL,OFF。

  root 节点可以包含 0 个或多个元素,将appender添加进来。如下:

 
   
   
 
  1. <root level="debug">

  2. <appender-ref ref="console" />

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

  4. </root>

appender 也是子节点之一,将会在后面说明。

1.2 property节点

  用于定义变量,方便使用。有两个属性:name,value。定义变量后,可以使用${}来使用变量。如下:

 
   
   
 
  1. <property name="path" value="./log"/>

  2. <property name="appname" value="app"/>

1.3 appender节点

appender中有2个必填属性--name和class。name为节点的名称,class为的全限定类名,也就是日志输出目的地的处理类。其中,encoder子节点用来控制日志的输出格式

 
   
   
 
  1. <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">

  2. <encoder>

  3. <pattern>%-4relative [%thread] %-5level %logger{35} - %msg %n</pattern>

  4. </encoder>

  5. </appender>

appender 用来格式化日志输出的节点,这个最重要。有两个属性:

  • name:该本 appender 命名

  • class:指定输出策略,通常有两种:控制台输出,文件输出

下面通过例子来说明这个怎么用:

在logback中,主要有以下三种日志目的地处理类:

1.3.1 ch.qos.logback.core.ConsoleAppender

将日志输出到控制台

 
   
   
 
  1. <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">

  2. <encoder>

  3. <pattern>%-4relative [%thread] %-5level %logger{35} - %msg %n</pattern>

  4. </encoder>

  5. </appender>

1.3.2 ch.qos.logback.core.FileAppender

将日志输出到具体的磁盘文件中,可以单独指定具体的位置,也可以设置日志的输出格式;

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

  2. <file>e:/log.out</file>

  3. <append>true</append>

  4. <prudent>false</prudent>

  5. <encoder>

  6. <pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern>

  7. </encoder>

  8. </appender>

子节点append:新增的日志是否以追加到文件结尾的方式写入到log.out文件中,true为追加,fasle为清空现存文件写入;子节点prudent:日志是否被安全的写入磁盘文件,默认为false。如果为true,则效率低下;

1.3.3 ch.qos.logback.core.rolling.RollingFileAppender

滚动记录日志,当符合rollingPolicy节点中设置的条件时,会将现有日志移到新的文件中去。rollingPolicy节点中可设置的条件为:文件的大小、时间等;

 
   
   
 
  1. <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">

  2. <file>e:/log.out</file>

  3. <append>true</append>

  4. <prudent>false</prudent>

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

  6. <fileNamePattern>testLog-%d{yyyy-MM-dd}.log</fileNamePattern>

  7. <maxHistory>30</maxHistory>

  8. </rollingPolicy>

  9. <encoder>

  10. <pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern>

  11. </encoder>

  12. </appender>

1.3.4 ch.qos.logback.classic.AsyncAppender

异步记录日志,内部通过使用缓存的方式来实现异步打印,将日志打印事件event放入缓存中。具体数据结构为BlockingQueue;

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

  2. <file>e:/log.out</file>

  3. <append>true</append>

  4. <prudent>false</prudent>

  5. <encoder>

  6. <pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern>

  7. </encoder>

  8. </appender>

  9. <appender name ="ASYNC" class= "ch.qos.logback.classic.AsyncAppender">

  10. <discardingThreshold>0</discardingThreshold>

  11. <queueSize>512</queueSize>

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

  13. </appender>

子节点queueSize:指的是BlockingQueue的队列容量大小,默认为256个;子节点discardingThreshold:如果BlockingQueue中还剩余20%的容量,那么程序会丢弃TRACE、DEBUG和INFO级别的日志打印事件event,只保留WARN和ERROR级别的。为了保留所有的日志打印事件,可以将该值设置为0。

1.3.5 rollingPolicy

日志文件的滚动策略,与RollingFileAppender搭配使用,当日志文件发生变动时决定RollingFileAppender的行为。在rollingPolicy节点中有一个class属性,可选的值为TimeBasedRollingPolicy、FixedWindowRollingPolicy、TriggeringPolicy。其中ch.qos.logback.core.rolling.TimeBasedRollingPolicy表示根据时间制定日志文件的滚动策略;

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

  2. <fileNamePattern>testLog-%d{yyyy-MM-dd}.log</fileNamePattern>

  3. <maxHistory>30</maxHistory>

  4. </rollingPolicy>

ch.qos.logback.core.rolling.FixedWindowRollingPolicy表示如果日志文件大小超过指定范围时,会根据文件名拆分成多个文件;

 
   
   
 
  1. <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">

  2. <fileNamePattern>tests.%i.log.zip</fileNamePattern>

  3. <minIndex>1</minIndex>

  4. <maxIndex>4</maxIndex>

  5. </rollingPolicy>

2.配置文件例子

 
   
   
 
  1. <?xml version="1.0" encoding="UTF-8"?>

  2. <configuration debug="false">

  3. <!--设置存储路径变量-->

  4. <property name="LOG_HOME" value="./log"/>


  5. <!--控制台输出appender-->

  6. <appender name="console" class="ch.qos.logback.core.ConsoleAppender">

  7. <!--设置输出格式-->

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

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

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

  11. <!--设置编码-->

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

  13. </encoder>

  14. </appender>


  15. <!--文件输出,时间窗口滚动-->

  16. <appender name="timeFileOutput" class="ch.qos.logback.core.rolling.RollingFileAppender">

  17. <!--日志名,指定最新的文件名,其他文件名使用FileNamePattern -->

  18. <File>${LOG_HOME}/timeFile/out.log</File>

  19. <!--文件滚动模式-->

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

  21. <!--日志文件输出的文件名,可设置文件类型为gz,开启文件压缩-->

  22. <FileNamePattern>${LOG_HOME}/timeFile/info.%d{yyyy-MM-dd}.%i.log.gz</FileNamePattern>

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

  24. <MaxHistory>30</MaxHistory>

  25. <!--按大小分割同一天的-->

  26. <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">

  27. <maxFileSize>10MB</maxFileSize>

  28. </timeBasedFileNamingAndTriggeringPolicy>

  29. </rollingPolicy>


  30. <!--输出格式-->

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

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

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

  34. <!--设置编码-->

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

  36. </encoder>


  37. </appender>

  38. <!-- 异步输出 -->

  39. <appender name="ASYNC-INFO" class="ch.qos.logback.classic.AsyncAppender">

  40. <!-- 不丢失日志.默认的,如果队列的80%已满,则会丢弃TRACT、DEBUG、INFO级别的日志 -->

  41. <discardingThreshold>0</discardingThreshold>

  42. <!-- 更改默认的队列的深度,该值会影响性能.默认值为256 -->

  43. <queueSize>256</queueSize>

  44. <!-- 添加附加的appender,最多只能添加一个 -->

  45. <appender-ref ref="timeFileOutput"/>

  46. </appender>

  47. <!--指定基础的日志输出级别-->

  48. <root level="INFO">

  49. <!--appender将会添加到这个loger-->

  50. <appender-ref ref="console"/>

  51. <appender-ref ref="timeFileOutput"/>

  52. </root>

  53. </configuration>

3 spring boot 使用logback日志

SpringBoot工程自带logback和slf4j的依赖,所以只要在maven依赖中添加了spring-boot-starter-logging即可。logback框架会默认加载classpath下命名为logback-spring或logback的配置文件。

 
   
   
 
  1. <dependency>

  2. <groupId>org.springframework.boot</groupId>

  3. <artifactId>spring-boot-starter-logging</artifactId>

  4. </dependency>

3.1 简单使用

如果无需复杂的日志配置,执行简单设置日志打印级别,打印方式可直接在application.yml 中配置。

 
   
   
 
  1. logging:

  2. # 配置日志存放路径,日志文件名为:spring.log

  3. path: e:/log

  4. file:

  5. # 设置日志文件大小

  6. max-size: 20MB

  7. level:

  8. # root日志以info级别输出

  9. root: info

  10. # 此包下所有class以DEBUG级别输出

  11. com.demo.test: debug

3.2 多环境日志输出

Spring Boot 官方推荐优先使用带有 -spring 的文件名作为你的日志配置(如使用 logback-spring.xml ,而不是 logback.xml ),命名为 logback-spring.xml 的日志配置文件, spring boot 可以为它添加一些 spring boot 特有的配置项示例如下:

 
   
   
 
  1. <configuration>

  2. <!-- 测试环境+开发环境. 多个使用逗号隔开. -->

  3. <springProfile name="test,dev">

  4. <logger name="com.test.demo" level="DEBUG" additivity="false">

  5. <appender-ref ref="console"/>

  6. </logger>

  7. </springProfile>

  8. <!-- 生产环境. -->

  9. <springProfile name="prod">

  10. <logger name="com.test.demo" level="INFO" additivity="false">

  11. <appender-ref ref="timeFileOutput"/>

  12. </logger>

  13. </springProfile>

  14. </configuration>

    下一章节《日志系列3——如何通过日志跟踪号快速定位日志》敬请期待。如果你觉得我写的还不错,请点击右下角 在看 按钮