2017-08-29 1386 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

您正在設置每日過期期限(這是從fileNamePattern:'%d {yyyy-MM-dd}''推出的)以及'maxHistory',它應該保留10天的歸檔文件。但是你也指定了一個'totalSizeCap';如果超過此限制,則logback將刪除已存檔的文件。這個帽子可能超過了嗎? – glytching

+0

你可以嘗試刪除行'rollingPolicy.setTotalSizeCap(FileSize.valueOf(「100MB」));'?換句話說,你能檢查文件大小是否沒有達到這個限制嗎? –

+0

我allready嘗試沒有totalSizeCap但結果相同。而且100MB的限制也沒有達到。 –

回答

0

我找到了原因。這是我的錯誤。我有一箇舊的進程每小時清理一次目錄。 :)。禁用後,logback按預期工作。您可以使用上面的代碼作爲示例。它工作正常。

0

我已經創建基於代碼的最小運行演示:

https://github.com/riskop/slf4j_logback_rollingfileappender_programatically

我剛剛下調totalSizeCap到1KB,改變fileNamePattern微小地滾動,並且創建了一個主要的方法來驅動配置:

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,上面的代碼產生一個或最多2個文件。如果我將capSize提高到10KB,那麼它會產生3-4個文件。

所以我想你的問題是由你的環境造成的。

你可以試試上面的代碼嗎?

您可以嘗試在您的環境(文件系統,目錄)中運行它。

如果我是你,我也會嘗試關閉maxHistory,totalCapSize和cleanHistory設置。

+0

我也嘗試過這種方法。滾動的每一分鐘都能正常工作,但不是每天滾動。 –

+0

昨晚我關掉了maxHistory,totalCapSize和cleanHistory。 –

+0

我離開我的測試昨天運行,它工作正常:現在我有昨天和當前文件1個存檔文件。 – riskop