logback 指定每隔一段時間創建一個日志文件


我使用的logback版本是1.2.3

目前logback支持根據時間來配置產生日志文件,但是只支持每周,每天,每個小時,每分鍾等創建一個文件,配置如下:

<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}/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>

        <rollingPolicy
            class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- daily rollover ,每天分鍾生成一份日志文件-->
            <fileNamePattern>${log.home}/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; @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 ,每10分鍾生成一份日志文件-->
            <fileNamePattern>${log.home}/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>

 兒童三輪車1--3童車,送給孩子的禮物


 

以上配置即可實現每隔10分鍾創建一個日志文件。需要注意的是,日志文件只有在有日志寫入時才會判斷是否創建一個新的日志文件,如果只是啟動服務器,會創建一個當前時間的日志文件 ,如果一直沒有日志寫入,10分鍾之后也不會自動創建日志文件。只有在日志數據寫入時才創建。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM