Logback中文网:Logback学习笔记(六)轮转策略:RollingPolicy和TriggeringPolicy

在上篇文章中介绍到,RollingFileAppenter  进行交互的有两个重要的子组件。第一个是RollingPolicy,它负责日志轮转的功能。另一个是TriggeringPolicy ,它负责日志轮转的时机。接下来的文章我们就学习一下 RollingPolicy 和 TriggeringPolicy 这两个日志轮转策略。

一、RollingPolicy简介

RollingPolicy 负责轮转的方式为:移动文件以及对文件改名。

RollingPolicy接口如下:

package ch.qos.logback.core.rolling;

import ch.qos.logback.core.FileAppender;
import ch.qos.logback.core.rolling.helper.CompressionMode;
import ch.qos.logback.core.spi.LifeCycle;

public interface RollingPolicy extends LifeCycle {
    void rollover() throws RolloverFailure;

    String getActiveFileName();

    CompressionMode getCompressionMode();

    void setParent(FileAppender var1);
}

RollingPolicy中的方法简介: 

  • rollover():负责对日志文件进行归档;
  • getActiveFileName:负责获取当前日志文件的名称;
  • getCompressingMode:决定采取哪种压缩模式;
  • serParent:用过此方法引用父类。

二、TimeBasedRollingPolicy

 TimeBasedRollingPolicy是最常见的轮转策略。它是基于时间来定义的轮转策略。例如按天或按月。TimeBasedRollingPolicy 即负责轮转的行为,也负责触发轮转。实际上TimeBasedRollingPolicy同时实现了RollingPolicy 和 TriggeringPolicy 接口。

1、TimeBasedRollingPolicy的属性

TimeBasedRollingPolicy的配置需要一个强制的属性 fileNamePattern 以及其他的可选属性。

  • fileNamePattern:

String类型,该属性定义了轮转时的属性名。它的值应该由文件名加上一个%d的占位符。%d应该包含java.text/SimpleDateFormat中规定的日期格式。如果忽略掉这个日期格式,默认文yyyy-MM-dd。轮转周期通过fileNamePattern推断出来的。可以指定多个 %d,但是只能有一个是主要的,用于推断轮转周期。其它的 %d 占位符必须通过 'aux' 标记为辅助的。还可以通过 aFloder/test.%d{yyyy-MM-dd-HH, UTC}.log 来指定一个时区,如果指定的 timezone 不能被识别或者拼写错误,将会根据TimeZone.getTimeZone(String)方法指定为 GMT。

  • maxHistory:

int类型,可选属性,用来控制最多保留多少数量的归档文件,将会异步删除旧的文件。当旧的归档文件被移除时,当初用来保存这些日志归档文件的文件夹也会在适当的时候被移除。比如,你指定按月轮转,指定 maxHistory = 6,那么 6 个月内的归档文件将会保留在文件夹内,大于 6 个月的将会被删除。

  • totalSizeCap:

int类型,可选属性,用来控制所有归档文件总的大小。当达到这个大小后,旧的归档文件将会被异步的删除。使用这个属性时还需要设置 maxHistory 属性。而且,maxHistory 将会被作为第一条件,该属性作为第二条件。

  • cleanHistoryOnStart:

boolean类型,如果设置为 true,那么在 appender 启动的时候,归档文件将会被删除。默认的值为 false。
归档文件的删除通常在轮转期间执行。但是,有些应用的存活时间可能等不到轮转触发。对于这种短期应用,可以通过设置该属性为 true,在 appender 启动的时候执行删除操作。

2、关于fileNamePattern的介绍

  • /wombat/foo.%d :

每天轮转(晚上零点)。由于省略了指定 %d 的日期格式,所以默认为 yyyy-MM-dd。

  • /wombat/%d{yyyy/MM}/foo.txt:

每个月开始的时候轮转。

  • /wombat/foo.%d{yyyy-ww}.log:

每周的第一天(取决于时区)轮转。

  • /wombat/foo%d{yyyy-MM-dd_HH}.log:

每小时轮转。

  • /wombat/foo%d{yyyy-MM-dd_HH-mm}.log:

每分钟轮转。

  • /wombat/foo%d{yyyy-MM-dd_HH-mm, UTC}.log:

每分钟轮转,时间格式为UTC。

  • /foo/%d{yyyy-MM, aux}/%d.log:

每天轮转。归档文件在包含年月的文件夹下。

任何斜杆或者反斜杠够会被当作文件夹分隔符。任何必要的文件夹都会在有需要的时候创建。你可以轻松的将日志文件放在单独的文件夹中。

TimeBasedRollingPolicy支持文件自动压缩。如果 fileNamePattern以 .gz 或者 .zip结尾,将会启动这个特性。

例如:/wombat/foo.%d.gz:每天轮转(晚上零点),自动将归档文件压缩成 GZIP 格式。

3、RollingFileAppender与TimeBaseRollingPolicy结合使用

非严格模式下的例子:



    
        logFile.log
        
            
            logFile.%d{yyyy-MM-dd}.log
            
            30
            3GB
        

        
            %-4relative [%thread] %-5level %logger{35} - %msg%n
        
    

    
        
    

开启严格模式可以支持多个JVM同时对日志文件的读写操作,但是日志的吞吐量变低:

    
        
        true
    

三、SizeAndTimeBasedRollingPolicy 

基于文件大小以及时间的轮转策略。

有时你希望按时轮转,但同时又想限制每个日志文件的大小。特别是如果后期处理工具需要对日志进行大小限制。为了满足这个需求,logback 配备了SizeAndTimeBasedRollingPolicy 。



    
        mylog.txt
        
            
            mylog-%d{yyyy-MM-dd}.%i.txt
            100MB
            60
            3GB
        

        
            %msg%n
        
    

    
        
    

注意,除了 %d 之外还有 %i。这两个占位符都是强制要求的。在当前时间还没有到达周期轮转之前,日志文件达到了maxFileSize 指定的大小,会进行归档,递增索引从 0 开始。

四、FixedWindowRollingPolicy

根据固定窗口算法重命名文件的滚动策略。有以下子节点:

  • :窗口索引最小值
  • :窗口索引最大值,当用户指定的窗口过大时,会自动将窗口设置为20。
  • :必须包含“%i”例如,假设最小值和最大值分别为1和2,命名模式为 mylog%i.log,会产生归档文件mylog1.log和mylog2.log。还可以指定文件压缩选项,例如,mylog%i.log.gz 或者 没有log%i.log.zip

示例:



    
        test.log
        
            tests.%i.log.zip
            1
            3
        

        
            5MB
        

        
            %-4relative [%thread] %-5level %logger{35} - %msg%n
        
    

    
        
    

五、TriggeringPolicy简介

TriggeringPolicy 的实现用于通知RollingFileAppender 何时轮转。TriggeringPolicy接口仅仅只包含了一个方法。

package ch.qos.logback.core.rolling;

import ch.qos.logback.core.spi.LifeCycle;
import java.io.File;

public interface TriggeringPolicy extends LifeCycle {
    boolean isTriggeringEvent(File var1, E var2);
}

 isTriggeringEvent方法接收当前活动的文件以及当前的日志事件作为参数。基于这些参数,通过具体的实现来决定轮转是不是应该发生。TimeBasedRollingPolicy是使用最广泛的触发策略。也可以用作轮转策略来使用。

SizeBasedTriggeringPolicy

SizeBasedTriggeringPolicy观察当前活动文件的大小,如果已经大于了指定的值,它会给 RollingFileAppender 发一个信号触发对当前活动文件的轮转。

SizeBasedTriggeringPolicy 只接收 maxFileSize 这一个参数,它的默认值是 10 MB。

maxFileSize 可以为字节,千字节,兆字节,千兆字节,通过在数值后面指定一个后缀 KBMB 或者 GB。例如,50000005000KB5MB 以及 2GB 都是有效的,前三个是一样的。

示例:



    
        test.log
        
            test.%i.log.zip
            1
            3
        

        
        
            5MB
        

        
            %-4relative [%thread] %-5level %logger{35} - %msg%n
            
        
    

    
        
    

 

你可能感兴趣的:(日志,Logback)