likes
comments
collection
share

logback解析——Appender

作者站长头像
站长
· 阅读数 40

在SSM框架搭建Java Web的过程中,需要去做日志处理。在配置logback的时候遇到了不少问题,因此而去深入地了解了一下logback。除了看了很多博客的介绍之外,还去看了一下logback的官方文档,看完之后需要去记录一下所见所得。

首先我们来介绍一个Appender的组成

Appender的类图如下:

logback解析——Appender

ConsoleAppender

ConsoleAppender用于控制台日志输出 官方文档给出了一个示例写法

<configuration>

  <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <!-- encoders are assigned the type
         ch.qos.logback.classic.encoder.PatternLayoutEncoder by default -->
    <encoder>
      <pattern>%-4relative [%thread] %-5level %logger{35} - %msg %n</pattern>
    </encoder>
  </appender>

  <root level="DEBUG">
    <appender-ref ref="STDOUT" />
  </root>
</configuration>
  • <encoder>的作用是将日志格式化,转换为字节数组,并将转换后的字节数组输出到OutputStream 在encoder出现之前,主要依靠Layout来处理日志格式化。

目前,PatternLayoutEncoder唯一真正有用的编码器。它只是包装了 PatternLayout大部分工作。 具体详见https://logback.qos.ch/manual/encoders.html

FileAppender

FileAppender用于将日志以文件形式保存起来 官方文档示例配置如下

<configuration>

  <!-- Insert the current time formatted as "yyyyMMdd'T'HHmmss" under
       the key "bySecond" into the logger context. This value will be
       available to all subsequent configuration elements. -->
  <timestamp key="bySecond" datePattern="yyyyMMdd'T'HHmmss"/>

  <appender name="FILE" class="ch.qos.logback.core.FileAppender">
    <!-- use the previously created timestamp to create a uniquely
         named log file -->
    <file>log-${bySecond}.txt</file>
    <encoder>
      <pattern>%logger{35} - %msg%n</pattern>
    </encoder>
  </appender>

  <root level="DEBUG">
    <appender-ref ref="FILE" />
  </root>
</configuration>
  • <timestamp>可以用这个属性来记录这个配置文件的解析时间(我暂时还想不到有什么用)
  • <file>记录文件的地址和文件名

RollingFileAppender

RollingFileAppender是对FileAppender的一个扩展。相较于它的父类,它的主要作用是滚动记录日志。 RollingFileAppender有两个重要的子组件:RollingPolicy和 TriggeringPolicy。RollingPolicy决定日志滚动方式,TriggeringPolicy决定日志滚动的触发条件。 (其实RollingPolicy也可以定义滚动的触发条件)

而RollingPolicy滚动策略包括以下几种:

TimeBasedRollingPolicy

基于时间的滚动策略。这个可能是最常用的滚动策略。 官方文档示例配置如下

<configuration>
  <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>logFile.log</file>
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
      <!-- daily rollover -->
      <fileNamePattern>logFile.%d{yyyy-MM-dd}.log</fileNamePattern>

      <!-- keep 30 days' worth of history capped at 3GB total size -->
      <maxHistory>30</maxHistory>
      <totalSizeCap>3GB</totalSizeCap>

    </rollingPolicy>

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

  <root level="DEBUG">
    <appender-ref ref="FILE" />
  </root>
</configuration>

  • <fileNamePattern>滚动后的文件名,也包括了滚动时间的选择。
  • <maxHistory>保留的存档文件的数量,与上一个fileNamePattern有关。假设定义为6,当fileNamePattern以天为单位时,即保存6天的日志;当以月为单位时,即保存6个月的日志。旧的日志以异步的方式删除。
  • <totalSizeCap>所有的归档日志的大小。当超过限制时,会删掉旧的归档日志。

SizeAndTimeBasedRollingPolicy

SizeAndTimeBasedRollingPolicy是基于时间和文件大小的滚动策略 官方文档示例配置如下

<configuration>
  <appender name="ROLLING" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>mylog.txt</file>
    <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
      <!-- rollover daily -->
      <fileNamePattern>mylog-%d{yyyy-MM-dd}.%i.txt</fileNamePattern>
       <!-- each file should be at most 100MB, keep 60 days worth of history, but at most 20GB -->
       <maxFileSize>100MB</maxFileSize>    
       <maxHistory>60</maxHistory>
       <totalSizeCap>20GB</totalSizeCap>
    </rollingPolicy>
    <encoder>
      <pattern>%msg%n</pattern>
    </encoder>
  </appender>


  <root level="DEBUG">
    <appender-ref ref="ROLLING" />
  </root>

</configuration>

<totalSizeCap>限定的是所有的归档日志文件,而<maxFileSize>限定的则是单个日志文件

FixedWindowRollingPolicy

基于窗口大小的滚动策略。 这个听起来可能有点难理解,其实说白了就是将归档日志文件到最大了就写到下一个文件里,而窗口大小就是最多允许多少份日志文件。 官方文档示例配置如下

<configuration>
  <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>test.log</file>

    <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
      <fileNamePattern>tests.%i.log.zip</fileNamePattern>
      <minIndex>1</minIndex>
      <maxIndex>3</maxIndex>
    </rollingPolicy>

    <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
      <maxFileSize>5MB</maxFileSize>
    </triggeringPolicy>
    <encoder>
      <pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern>
    </encoder>
  </appender>
        
  <root level="DEBUG">
    <appender-ref ref="FILE" />
  </root>
</configuration>
  • <minIndex>窗口下限。下限一般都是1啦。
  • <maxIndex>窗口上限。一般我们用上限就可以了。

SizeBasedTriggeringPolicy

SizeBasedTriggeringPolicy其实是TriggeringPolicy(决定什么时候滚动),好像目前暂时也只有这么一个TriggeringPolicy。 主要作用是归档日志文件到达一定大小之后进行日志滚动。 根据网上的说法,TimeBasedRollingPolicy和SizeBasedTriggeringPolicy冲突,不能同时使用。

旧版本的logback里可以在TimeBasedRollingPolicy这个rollingPolicy下配置一个timeBasedFileNamingAndTriggeringPolicy(实现类为SizeAndTimeBasedFNATP)达到同时配置时间和文件大小的滚动策略;而在新版本里其实使用SizeAndTimeBasedRollingPolicy就可以同时满足两个需求了。

附录:

下面给出一个旧版本里Appender的配置:

<!-- 日志文件输出 -->
    <appender name="file" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <File>${log.base}/${log.moduleName}.log</File><!-- 设置日志不超过${log.max.size}时的保存路径,注意如果 是web项目会保存到Tomcat的bin目录 下 -->
        <!-- 滚动记录文件,先将日志记录到指定文件,当符合某个条件时,将日志记录到其他文件。-->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <FileNamePattern>${log.base}/${log.moduleName}_all_%d{yyyy-MM-dd}.%i.log.zip
            </FileNamePattern>
            <!-- 当天的日志大小 超过${log.max.size}时,压缩日志并保存 -->
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>${log.max.size}</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>
        <!-- 日志输出的文件的格式  -->
        <layout class="ch.qos.logback.classic.PatternLayout">
            <pattern>%date{yyyy-MM-dd HH:mm:ss.SSS} %-5level %logger{56}.%method:%L -%msg%n</pattern>
        </layout>
    </appender>

而新版本里的SizeAndTimeBasedRollingPolicy配置,官方给出的示例如下:

<configuration>
  <appender name="ROLLING" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>mylog.txt</file>
    <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
      <!-- rollover daily -->
      <fileNamePattern>mylog-%d{yyyy-MM-dd}.%i.txt</fileNamePattern>
       <!-- each file should be at most 100MB, keep 60 days worth of history, but at most 20GB -->
       <maxFileSize>100MB</maxFileSize>    
       <maxHistory>60</maxHistory>
       <totalSizeCap>20GB</totalSizeCap>
    </rollingPolicy>
    <encoder>
      <pattern>%msg%n</pattern>
    </encoder>
  </appender>


  <root level="DEBUG">
    <appender-ref ref="ROLLING" />
  </root>

</configuration>
转载自:https://juejin.cn/post/6844903537650958349
评论
请登录