自定义logback触发器策略进行日志滚动

小编辑 发布于 2010/02/09 00:55
阅读 6K+
收藏 1

从一年多以前就开始使用和关注logback,一来是对log4j作者的信任,另外也确实感受到了logback的强大

这两天在做一 个Oracle向LDAP导入的应用,在导入过程中,希望使用log文件来记录rollback信息。这样log文件的rolling就是一个很大的问 题。logback本身只提供了两种文件的rolling策略:FixedWindowRollingPolicy和 TimeBasedRollingPolicy,另外提供了一种触发器策略SizeBasedTriggeringPolicy。由于log文件记录有回 滚信息,因此我希望能够每一次执行导入程序就产生一个新的log文件并且将原有的log文件进行备份,实际上也就是每次启动程序就roll一下log文 件。显然以上策略均无法满足我的需求,只能自己写了。

FixedWindowRollingPolicy是一个很简单的日志滚动策略,每次 触发器触发滚动事件时,则将log滚动一次。因此决定使用这个滚动策略来配合一个自定义的触发器策略实现我的需求。

首先,我们熟悉下 FixedWindowRollingPolicy及触发器的配置,下面是官网的一个sample:

<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>
    <layout class="ch.qos.logback.classic.PatternLayout">
      <Pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</Pattern>
    </layout>
  </appender>
 
  <root>
    <level value="debug" />
    <appender-ref ref="FILE" />
  </root>
</configuration>

其 他没啥好说的,注意绿色底的字和黄色底的字。绿色底是FixedWindowsRollingPolicy的配置内容,黄色的是 SizeBasedTriggeringPolicy内容。当SizeBasedTriggeringPolicy触发时(即文件大小达到5MB),则启 动FixedWindowsRollingPolicy对日志文件进行滚动。MinIndex和MaxIndex分别表示最小计数和最大计数。 MaxFileSize则表示日志文件达到多少的时候进行滚动。

然后看看触发器策略类的定义,触发器必须实现 TriggeringPolicy接口,本身只有一个方法

public boolean isTriggeringEvent(final File activeFile, final Object event); 

但 TriggeringPolicy继承的LifeCycle接口需要实现一些其他的接口,所以我们一般可以直接继承于logback本身提供的一个抽象类 TriggeringPolicyBase,这样就只需要关注实现上面那个isTriggeringEvent方法了,呵呵。于是自己实现的类框架代码如 下:

public class EverytimeTriggeringPolicy<E> extends TriggeringPolicyBase<E> {
    public boolean isTriggeringEvent(File file, E whatever) {
        //TODO
        return false;
    }
}

由于我只是希望每次应用程序启动时就 生成一次日志文件,所以只需要一个标识来确定现在是不是程序刚执行即可,实现如下:

public class EverytimeTriggeringPolicy<E> extends TriggeringPolicyBase<E> {
    private static boolean triggeringFlag = true;    //静态全局标识,初始为true
    public boolean isTriggeringEvent(File file, E whatever) {
        //如果标识不为true,则不触发文件滚动
        if (triggeringFlag == false)
            return false;
        //如果标识为true,则将其改为false并触发文件滚动
        triggeringFlag = false;
        return true;
    }

这样我 的滚动策略类就完成了,哈哈。最后在配置文件里配置appender如下:

<appender name="TRANSFER_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <Encoding>UTF-8</Encoding>
    <File>transfer.log</File>
    <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
        <FileNamePattern>transfer_%i.log</FileNamePattern>
        <MinIndex>1</MinIndex>
        <MaxIndex>10</MaxIndex>
    </rollingPolicy>
    <triggeringPolicy class="com.baidu.baseinfo.util.EverytimeTriggeringPolicy" />
    <layout class="ch.qos.logback.classic.PatternLayout">
        <pattern>%date [%thread] %-5level %logger{80} - %msg%n</pattern>
    </layout>
</appender>

上 面黄色的内容即是指向我的自定义日志滚动策略类

加载中
返回顶部
顶部