Logback简介

logback是一个开源的日志组件,是log4j的作者开发的用来替代log4j的。
logback由三个部分组成,logback-core, logback-classic, logback-access。其中logback-core是其他两个模块的基础。

logback-classic:它是log4j的一个改良版本,同时它完整实现了slf4j API,使我们可以在其他日志系统,如log4j和JDK14 Logging中进行转换
logback-access:访问模块和Servlet容器集成,提供通过Http来访问日志的功能

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- scan属性是true时,如果配置文档发生改变将会进行重新加载 -->
  3. <!-- scanPeriod属性设置监测配置文件修改的时间间隔,默认单位为毫秒,在scan为true时才生效 -->
  4. <!-- debug属性如果为true时,会打印出logback内部的日志信息 -->
  5. <configuration scan="true" scanPeriod="60 seconds" debug="false">
  6. <!-- 定义参数常量 -->
  7. <!-- 日志级别:TRACE<DEBUG<INFO<WARN<ERROR,其中常用的是DEBUG、INFO和ERROR -->
  8. <property name="log.level" value="debug" />
  9. <!-- 文件保留时间 -->
  10. <property name="log.maxHistory" value="30" />
  11. <!-- 日志存储路径 -->
  12. <property name="log.filePath" value="${catalina.base}/logs/webapps" />
  13. <!-- 日志的显式格式 -->
  14. <property name="log.pattern"
  15. value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50}-%msg%n"></property>
  16. <!-- 用于说明输出介质,此处说明控制台输出 -->
  17. <appender name="consoleAppender"
  18. class="ch.qos.logback.core.ConsoleAppender">
  19. <!-- 类似于layout,除了将时间转化为数组,还会将转换后的数组输出到相应的文件中 -->
  20. <encoder>
  21. <!-- 定义日志的输出格式 -->
  22. <pattern>${log.pattern}</pattern>
  23. </encoder>
  24. </appender>
  25. <!-- DEBUG,表示文件随着时间的推移按时间生成日志文件 -->
  26. <appender name="debugAppender"
  27. class="ch.qos.logback.core.rolling.RollingFileAppender">
  28. <!-- 文件路径 -->
  29. <file>${log.filePath}/debug.log</file>
  30. <!-- 滚动策略 -->
  31. <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
  32. <!-- 设置文件名称 -->
  33. <fileNamePattern>
  34. ${log.filePath}/debug/debug.%d{yyyy-MM-dd}.log.gz
  35. </fileNamePattern>
  36. <!-- 设置最大保存周期 -->
  37. <MaxHistory>${log.maxHistory}</MaxHistory>
  38. </rollingPolicy>
  39. <encoder>
  40. <pattern>${log.pattern}</pattern>
  41. </encoder>
  42. <!-- 过滤器,过滤掉不是指定日志水平的日志 -->
  43. <filter class="ch.qos.logback.classic.filter.LevelFilter">
  44. <!-- 设置日志级别 -->
  45. <level>DEBUG</level>
  46. <!-- 如果跟该日志水平相匹配,则接受 -->
  47. <onMatch>ACCEPT</onMatch>
  48. <!-- 如果跟该日志水平不匹配,则过滤掉 -->
  49. <onMismatch>DENY</onMismatch>
  50. </filter>
  51. </appender>
  52. <!-- INFO,表示文件随着时间的推移按时间生成日志文件 -->
  53. <appender name="infoAppender"
  54. class="ch.qos.logback.core.rolling.RollingFileAppender">
  55. <!-- 文件路径 -->
  56. <file>${log.filePath}/info.log</file>
  57. <!-- 滚动策略 -->
  58. <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
  59. <!-- 设置文件名称 -->
  60. <fileNamePattern>
  61. ${log.filePath}/info/info.%d{yyyy-MM-dd}.log.gz
  62. </fileNamePattern>
  63. <!-- 设置最大保存周期 -->
  64. <MaxHistory>${log.maxHistory}</MaxHistory>
  65. </rollingPolicy>
  66. <encoder>
  67. <pattern>${log.pattern}</pattern>
  68. </encoder>
  69. <!-- 过滤器,过滤掉不是指定日志水平的日志 -->
  70. <filter class="ch.qos.logback.classic.filter.LevelFilter">
  71. <!-- 设置日志级别 -->
  72. <level>INFO</level>
  73. <!-- 如果跟该日志水平相匹配,则接受 -->
  74. <onMatch>ACCEPT</onMatch>
  75. <!-- 如果跟该日志水平不匹配,则过滤掉 -->
  76. <onMismatch>DENY</onMismatch>
  77. </filter>
  78. </appender>
  79. <!-- ERROR,表示文件随着时间的推移按时间生成日志文件 -->
  80. <appender name="errorAppender"
  81. class="ch.qos.logback.core.rolling.RollingFileAppender">
  82. <!-- 文件路径 -->
  83. <file>${log.filePath}/error.log</file>
  84. <!-- 滚动策略 -->
  85. <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
  86. <!-- 设置文件名称 -->
  87. <fileNamePattern>
  88. ${log.filePath}/error/error.%d{yyyy-MM-dd}.log.gz
  89. </fileNamePattern>
  90. <!-- 设置最大保存周期 -->
  91. <MaxHistory>${log.maxHistory}</MaxHistory>
  92. </rollingPolicy>
  93. <encoder>
  94. <pattern>${log.pattern}</pattern>
  95. </encoder>
  96. <!-- 过滤器,过滤掉不是指定日志水平的日志 -->
  97. <filter class="ch.qos.logback.classic.filter.LevelFilter">
  98. <!-- 设置日志级别 -->
  99. <level>ERROR</level>
  100. <!-- 如果跟该日志水平相匹配,则接受 -->
  101. <onMatch>ACCEPT</onMatch>
  102. <!-- 如果跟该日志水平不匹配,则过滤掉 -->
  103. <onMismatch>DENY</onMismatch>
  104. </filter>
  105. </appender>
  106. <!-- 用于存放日志对象,同时指定关联的package位置 -->
  107. <!-- name指定关联的package -->
  108. <!-- level表明指记录哪个日志级别以上的日志 -->
  109. <!-- appender-ref指定logger向哪个文件输出日志信息 -->
  110. <!-- additivity为true时,logger会把根logger的日志输出地址加入进来,但logger水平不依赖于根logger -->
  111. <logger name="<包名>" level="${log.level}" additivity="true">
  112. <appender-ref ref="debugAppender" />
  113. <appender-ref ref="infoAppender" />
  114. <appender-ref ref="errorAppender" />
  115. </logger>
  116. <!-- 特殊的logger,根logger -->
  117. <root lever="info">
  118. <!-- 指定默认的日志输出 -->
  119. <appender-ref ref="consoleAppender" />
  120. </root>
  121. </configuration>

流程

configuration

一个 logback.xml 的所有配置是包含在 configuration 里面的。

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

configuration 的参数有:

  1. scan: 属性值为 true / false 表示,如果配置文件发生改变的时候,就重新进行加载
  2. scanPeriod: 60 seconds 表示 60 毫秒检查一次。 只有 scan = true 的时候才有效
  3. debug: 如果为 true 会打印出 logback 的内部日志信息

定义变量

<property name="log.level" value="debug" />
<!-- 文件保留时间 -->
<property name="log.maxHistory" value="30" />
<!-- 日志存储路径 -->
<property name="log.filePath" value="logs" />
<!-- 日志的显式格式 -->
<property name="log.pattern"
          value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50}-%msg%n"></property>

使用变量

<appender name="consoleAppender"
          class="ch.qos.logback.core.ConsoleAppender">
  <!-- 类似于layout,除了将时间转化为数组,还会将转换后的数组输出到相应的文件中 -->
  <encoder>
    <!-- 定义日志的输出格式 -->
    <pattern>${log.pattern}</pattern>
  </encoder>
</appender>

使用变量如上所示 ${log.pattern}

appender

appender 就是我们定义日志输出的详细配置
首先是定义命令行输出:

<!-- 用于说明输出介质,此处说明控制台输出 -->
<appender name="consoleAppender"
          class="ch.qos.logback.core.ConsoleAppender">
  <!-- 类似于layout,除了将时间转化为数组,还会将转换后的数组输出到相应的文件中 -->
  <encoder>
    <!-- 定义日志的输出格式 -->
    <pattern>${log.pattern}</pattern>
  </encoder>
</appender>

接着是定义日志输出到文件

<appender name="debugAppender"
          class="ch.qos.logback.core.rolling.RollingFileAppender">
  <!-- 文件路径 -->
  <file>${log.filePath}/debug.log</file>
  <!-- 滚动策略 -->
  <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
    <!-- 设置文件名称 -->
    <fileNamePattern>
      ${log.filePath}/debug/debug.%d{yyyy-MM-dd}.log.gz
    </fileNamePattern>
    <!-- 设置最大保存周期 -->
    <MaxHistory>${log.maxHistory}</MaxHistory>
    <totalSizeCap>20GB</totalSizeCap>
    <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
      <!--文件达到最大10MB时会被压缩和切割-->
      <maxFileSize>10MB</maxFileSize>
    </timeBasedFileNamingAndTriggeringPolicy>
  </rollingPolicy>
  <encoder>
    <pattern>${log.pattern}</pattern>
  </encoder>
  <!-- 过滤器,过滤掉不是指定日志水平的日志 -->
  <filter class="ch.qos.logback.classic.filter.LevelFilter">
    <!-- 设置日志级别 -->
    <level>DEBUG</level>
    <!-- 如果跟该日志水平相匹配,则接受 -->
    <onMatch>ACCEPT</onMatch>
    <!-- 如果跟该日志水平不匹配,则过滤掉 -->
    <onMismatch>DENY</onMismatch>
  </filter>
</appender>

这里就有比较多的属性,可以了解一下
file: 文件路径
rollingPolicy: 滚动策略,因为日志是不断增加的,所以按照日期来生产log
fileNamePattern: 文件名规则
MaxHistory: 最大保留周期
totalSizeCap: 最大容量
timeBasedFileNamingAndTriggeringPolicy: maxFileSize 文件到达这个容量将进行切割
encoder: pattern, 输出规则
filter: 级别过滤器,如果符合这个级别才进行记录,否则就不进行记录。
日志级别由低到高: trace < debug < info < warm < error
所以 debug 会记录 debug及以上的

logger

指定具体的 logger, 针对包名,指定具体监听的logger, 比如

<logger name="<包名>" level="${log.level}" additivity="true">
  <appender-ref ref="debugAppender" />
  <appender-ref ref="infoAppender" />
  <appender-ref ref="errorAppender" />
</logger>

这里针对这个包名,我们指定了三个监听的 logger, 只要有关这个包的输出,都会被记录到文件中

root

指定默认的日志输出

<root lever="info">
  <!-- 指定默认的日志输出 -->
  <appender-ref ref="debugAppender" />
  <appender-ref ref="consoleAppender" />
</root>

这里是最基本的日志输出。 也是必须配置。这里我们设置了两个,一个是输出到文件,一个是命令行输出

https://www.jianshu.com/p/73a00438ad24