我使用的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>
以上配置便可实现每隔10分钟建立一个日志文件。须要注意的是,日志文件只有在有日志写入时才会判断是否建立一个新的日志文件,若是只是启动服务器,会建立一个当前时间的日志文件 ,若是一直没有日志写入,10分钟以后也不会自动建立日志文件。只有在日志数据写入时才建立。