我使用的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分鐘以後也不會自動建立日誌文件。只有在日誌數據寫入時才建立。