本文主要是介绍@@@logback 指定每隔一段时间创建一个日志文件(五),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
我使用的logback版本是1.2.3
目前logback支持根据时间来配置产生日志文件,但是只支持每周,每天,每个小时,每分钟等创建一个文件,配置如下:
<appender name="SYSTEM"class="ch.qos.logback.core.rolling.RollingFileAppender"><file>${log.home}/system.log</file><rollingPolicyclass="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个小时生成一个日志配置文件等。
下面以每隔10分钟生成一个日志文件,首先看一个每分钟生成一个配置文件 的配置
<appender name="SYSTEM"class="ch.qos.logback.core.rolling.RollingFileAppender"><file>${log.home}/system.log</file><rollingPolicyclass="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>
但是发现在配置中,没有指定每隔多长时间来生成一个配置文件,没办法,只能看源码,加百度了。首先看配置里面的
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
TimeBasedRollingPolicy 这个类就是日志文件生成的策略类,看它的源码
再看这个timeBasedFileNamingAndTriggeringPolicy触发策略,在ch.qos.logback.core.rolling.TimeBasedRollingPolicy类的start方法中有这样一段代码
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();
protected void computeNextCheck() {nextCheck = rc.getNextTriggeringDate(dateInCurrentPeriod).getTime();}
再看这个方法:rc.getNextTriggeringDate,根据它最终可以找到:
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)方法,我们可以看到之前说的每小时,每分钟,都是这里调用的是
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;@Overrideprotected 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><rollingPolicyclass="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>
这篇关于@@@logback 指定每隔一段时间创建一个日志文件(五)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!