logback 指定每隔一段时间建立一个日志文件

我使用的logback版本是1.2.3服务器

目前logback支持根据时间来配置产生日志文件,可是只支持每周,天天,每一个小时,每分钟等建立一个文件,配置以下:app

<appender name="SYSTEM"
        class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${log.home}/system.log</file>

        <rollingPolicy
            class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- daily rollover ,天天生成一份日志文件-->
            <fileNamePattern>${log.home}/%d{yyyy-MM-dd}/system.%d{yyyy-MM-dd}.log
            </fileNamePattern>
            <maxHistory>7</maxHistory>
        </rollingPolicy>

        <encoder>
            <pattern>%d{HH:mm:ss} %-5level [%thread][%file:%line] : %msg%n
            </pattern>
        </encoder>
    </appender>

可是需求是没法想象的,像忽然又要求每隔一段时间以后生成一个配置文件,好比logback每隔10分钟生成一个日志文件,或每隔30分钟生成一份日志文件,每隔2个小时生成一个日志配置文件等。ide

下面以每隔10分钟生成一个日志文件,首先看一个每分钟生成一个配置文件 的配置this

<appender name="SYSTEM"
        class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${log.home}/system.log</file>

        <rollingPolicy
            class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- daily rollover ,天天分钟生成一份日志文件-->
            <fileNamePattern>${log.home}/%d{yyyy-MM-dd}/system.%d{yyyy-MM-dd-HH-mm}.log
            </fileNamePattern>
            <maxHistory>7</maxHistory>
        </rollingPolicy>

        <encoder>
            <pattern>%d{HH:mm:ss} %-5level [%thread][%file:%line] : %msg%n
            </pattern>
        </encoder>
    </appender>

可是发如今配置中,没有指定每隔多长时间来生成一个配置文件,没办法,只能看源码,加百度了。首先看配置里面的spa

<rollingPolicy  class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
TimeBasedRollingPolicy 这个类就是日志文件生成的策略类,看它的源码

 

再看这个timeBasedFileNamingAndTriggeringPolicy触发策略,在ch.qos.logback.core.rolling.TimeBasedRollingPolicy类的start方法中有这样一段代码3d

        if (timeBasedFileNamingAndTriggeringPolicy == null) {
            timeBasedFileNamingAndTriggeringPolicy = new DefaultTimeBasedFileNamingAndTriggeringPolicy<E>();
        }

这说明timeBasedFileNamingAndTriggeringPolicy是能够被外部设置的,若是没有设置刚使用默认的实现。咱们再看DefaultTimeBasedFileNamingAndTriggeringPolicy,这里面的判断是否触发 写日志的方法:日志

 public boolean isTriggeringEvent(File activeFile, final E event) {
        long time = getCurrentTime();
        if (time >= nextCheck) {
            Date dateOfElapsedPeriod = dateInCurrentPeriod;
            addInfo("Elapsed period: " + dateOfElapsedPeriod);
            elapsedPeriodsFileName = tbrp.fileNamePatternWithoutCompSuffix.convert(dateOfElapsedPeriod);
            setDateInCurrentPeriod(time);
            computeNextCheck();
            return true;
        } else {
            return false;
        }
    }

这里面有一个比较即time> nextCheck,若是当前时间大于下一个判断时间,则触 发生成日志,这里面有一个计算NextCheck时间的方法:computeNextCheck();code

    protected void computeNextCheck() {
        nextCheck = rc.getNextTriggeringDate(dateInCurrentPeriod).getTime();
    }

再看这个方法:rc.getNextTriggeringDate,根据它最终能够找到:blog

 public Date getEndOfNextNthPeriod(Date now, int periods) {
        return innerGetEndOfNextNthPeriod(this, this.periodicityType, now, periods);
    }

    public Date getNextTriggeringDate(Date now) {
        return getEndOfNextNthPeriod(now, 1);
    }

它最终仍是调用的 public Date getEndOfNextNthPeriod(Date now, int periods)方法,咱们能够看到以前说的每小时,每分钟,都是这里调用的是ip

getEndOfNextNthPeriod(now, 1); 若是咱们想实现每2小时,每10分钟的话,只须要调用
getEndOfNextNthPeriod(now, 2); 或getEndOfNextNthPeriod(now, 10);至因而小时仍是分钟,是由这个innerGetEndOfNextNthPeriod方法时里面判断的,是根据你的配置文件生成的PeriodicityType决定的。那咱们要实现本身的每隔n段时间以后生成一个配置文件,只须要实现一个本身的类便可

package com.common.log;

import ch.qos.logback.core.joran.spi.NoAutoStart;
import ch.qos.logback.core.rolling.DefaultTimeBasedFileNamingAndTriggeringPolicy;

@NoAutoStart
public class MyTimeBasedFileNamingAndTriggeringPolicy<E> extends DefaultTimeBasedFileNamingAndTriggeringPolicy<E> {
   //这个用来指定时间间隔 
   private Integer multiple = 1;

    @Override
    protected void computeNextCheck() {
        nextCheck = rc.getEndOfNextNthPeriod(dateInCurrentPeriod, multiple).getTime();
    }

    public Integer getMultiple() {
        return multiple;
    }

    public void setMultiple(Integer multiple) {
        if (multiple > 1) {
            this.multiple = multiple;
        }
    }
}

对应的配置以下:

<appender name="SYSTEM"
        class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${log.home}/system.log</file>

        <rollingPolicy
            class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- daily rollover ,天天分钟生成一份日志文件-->
            <fileNamePattern>${log.home}/%d{yyyy-MM-dd}/system.%d{yyyy-MM-dd-HH-mm}.log
            </fileNamePattern>

              <timeBasedFileNamingAndTriggeringPolicy

               class="com.common.log.MyTimeBasedFileNamingAndTriggeringPolicy">

               <multiple>10</multiple>

                </timeBasedFileNamingAndTriggeringPolicy>

            <maxHistory>7</maxHistory>
        </rollingPolicy>

        <encoder>
            <pattern>%d{HH:mm:ss} %-5level [%thread][%file:%line] : %msg%n
            </pattern>
        </encoder>
    </appender>

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值