2017-08-29 34 views
1

私はRollingFileAppenderをTimeBasedRollingPolicyで使用していますので、真夜中に新しいログファイルが作成され、古いログは10日間保存されます。 真夜中に新しいログファイルが作成されますが、古いログファイルはすぐに、時には数分後にも削除されます。logback:TimeBasedRollingPolicy日次ローリングは動作しますが、古いログファイルはすべて削除されます

public static void init(String logfilename,String loggername,String pattern) throws Exception { 
    LoggerContext context = (LoggerContext)LoggerFactory.getILoggerFactory(); 

    logfilename = new File(logfilename).getCanonicalPath(); 

    PatternLayoutEncoder encoder = new PatternLayoutEncoder(); 
    encoder.setContext(context); 
    encoder.setPattern(pattern); 
    encoder.start(); 

    RollingFileAppender<ILoggingEvent> rollingFileAppender = new RollingFileAppender<>(); 
    rollingFileAppender.setContext(context); 
    rollingFileAppender.setName(loggername); 
    rollingFileAppender.setEncoder(encoder); 
    rollingFileAppender.setAppend(true); 
    rollingFileAppender.setFile(logfilename+".log"); 

    TimeBasedRollingPolicy<ILoggingEvent> rollingPolicy = new TimeBasedRollingPolicy<>(); 
    rollingPolicy.setContext(context); 
    rollingPolicy.setParent(rollingFileAppender); 
    rollingPolicy.setFileNamePattern(logfilename+".%d{yyyy-MM-dd}.log"); 
    rollingPolicy.setMaxHistory(10); 
    rollingPolicy.setTotalSizeCap(FileSize.valueOf("100MB")); 
    rollingPolicy.setCleanHistoryOnStart(false); 
    rollingPolicy.start(); 

    rollingFileAppender.setRollingPolicy(rollingPolicy);  
    rollingFileAppender.start(); 

    Logger logger = (Logger)LoggerFactory.getLogger(loggername); 
    logger.setAdditive(false); 
    logger.setLevel(Level.INFO); 
    logger.detachAndStopAllAppenders(); 
    logger.addAppender(rollingFileAppender); 
} 

この場合、MaxHistoryは10日を意味するはずですが、動作しません。

+0

アーカイブされたファイルが保持されている10日の結果となる 'maxHistory'とともに、1日のロールオーバー期間(これはfileNamePattern:'%d {yyyy-MM-dd} 'から推測されます)を設定しています。しかし、あなたは 'totalSizeCap'を指定しています。この上限を超えると、logbackはアーカイブファイルを削除します。この上限を超えている可能性はありますか? – glytching

+0

'rollingPolicy.setTotalSizeCap(FileSize.valueOf(" 100MB "));'行を削除してみることができますか?つまり、ファイルサイズがその制限に達していないかどうかを確認できますか? –

+0

私はすでにtotalSizeCapを使わずに試してみましたが、同じ結果が出ました。 100MBの制限にも達していません。 –

答えて

0

私はその理由を発見しました。それは私の間違いでした。私は古いプロセスを持っていて、毎時間ディレクトリを掃除しました。 :)。無効にすると、ログバックは正常に機能します。上記のコードを例として使用することができます。それはうまく動作します。

0

は、私はあなたのコードに基づいて、最小限のランニングのデモを作成しました:私はちょうど1キロバイトにtotalSizeCapを下げてきた

https://github.com/riskop/slf4j_logback_rollingfileappender_programatically

、細かくロールfileNamePatternを変更し、設定を駆動するためのmainメソッドを作成しました:

public static void main(String[] args) throws Exception { 

    init2("A_LOG_FILE", "A_LOGGER_NAME", "%d{HH:mm:ss.SSS} %-5level %logger - %msg%n"); 

    while (true) { 
     org.slf4j.Logger logger = LoggerFactory.getLogger("A_LOGGER_NAME"); 
     logger.warn("a warning " + System.currentTimeMillis()); 
     Thread.sleep(1000); 
    } 
} 

public static void init2(String logfilename,String loggername,String pattern) throws Exception { 
    LoggerContext context = (LoggerContext)LoggerFactory.getILoggerFactory(); 

    logfilename = new File(logfilename).getCanonicalPath(); 

    PatternLayoutEncoder encoder = new PatternLayoutEncoder(); 
    encoder.setContext(context); 
    encoder.setPattern(pattern); 
    encoder.start(); 

    RollingFileAppender<ILoggingEvent> rollingFileAppender = new RollingFileAppender<>(); 
    rollingFileAppender.setContext(context); 
    rollingFileAppender.setName(loggername); 
    rollingFileAppender.setEncoder(encoder); 
    rollingFileAppender.setAppend(true); 
    rollingFileAppender.setFile(logfilename+".log"); 

    TimeBasedRollingPolicy<ILoggingEvent> rollingPolicy = new TimeBasedRollingPolicy<>(); 
    rollingPolicy.setContext(context); 
    rollingPolicy.setParent(rollingFileAppender); 
    rollingPolicy.setFileNamePattern(logfilename+".%d{yyyy-MM-dd_HH-mm}.log"); 
    rollingPolicy.setMaxHistory(10); 
    rollingPolicy.setTotalSizeCap(FileSize.valueOf("1KB")); 
    rollingPolicy.setCleanHistoryOnStart(false); 
    rollingPolicy.start(); 

    rollingFileAppender.setRollingPolicy(rollingPolicy);  
    rollingFileAppender.start(); 

    Logger logger = (Logger)LoggerFactory.getLogger(loggername); 
    logger.setAdditive(false); 
    logger.setLevel(Level.INFO); 
    logger.detachAndStopAllAppenders(); 
    logger.addAppender(rollingFileAppender); 
} 

しかし、うまくいきます。上記のコードは、非常に低いcapSizeに従って、1つまたは最大2つのファイルになります。 capSizeを10KBにすると、3 - 4ファイルになります。

あなたの問題は何とかあなたの環境に起因すると思います。

上記のコードを試してみませんか?

あなたの環境(ファイルシステム、ディレクトリ)内で実行しようとしてください。

私があなただったら、maxHistory、totalCapSize、およびcleanHistoryの設定をオフにしてみます。

+0

私はこれもすべて試しました。毎分のローリングはうまく動作しますが、毎日のローリングは動作しません。 –

+0

昨夜私はmaxHistory、totalCapSize、cleanHistoryをオフにしました。 –

+0

私は昨日私のテストを残して、そしてそれは正常に働いた:今私は昨日のための1アーカイブファイルと現在のファイルがあります。 – riskop

関連する問題