簡體   English   中英

動態更改Log4j文件名

[英]Changing Log4j file name dynamically

我在我的項目中實現Log4j。 我想將每n個(例如10個)日志條目記錄到新文件中。 我嘗試使用“ RollingFileAppender”,但我認為它只會根據大小和時間來更改日志文件。

到目前為止,我做了下面的代碼:

log4j.properties

log4j.logger.ControlTable=debug, controlTable
log4j.additivity.ControlTable = false
log4j.appender.controlTable=org.apache.log4j.RollingFileAppender
log4j.appender.controlTable.File=${log4jfilename}
log4j.appender.controlTable.MaxFileSize=10MB
log4j.appender.controlTable.MaxBackupIndex=10
log4j.appender.controlTable.layout=org.apache.log4j.PatternLayout

主要

public class ControlTableLoggerConsumer {
static {
    System.setProperty("log4jfilename","d:\\control_log_1_9.json");
}
private static final Logger log = Logger.getLogger("ControlTable");
private static long logEntries = 0;
public static void main(String args[]) {
      System.out.println("Curr log file:"+logEntries+"::"+System.getProperty("log4jfilename"));
      log.info("Log entry:"+logEntries);
      logEntries++;
      if((logEntries >= 10) && ((logEntries % 10) == 0)) {
         System.out.println("going to change file name to "+"d:\\control_log_"+logEntries+"_"+(logEntries+9)+".json");
         System.setProperty("log4jfilename","d:\\control_log_"+logEntries+"_"+(logEntries+9)+".json");
      }
      if(logEntries == 1000)
         break;
}

在控制台上,我可以看到每10個條目的文件名都會更改,但是在D驅動器中,我只能看到一個包含所有日志信息的文件。

最后,我解決了這個問題,如下所示。

Properties props = new Properties(); 
    try { 
        InputStream configStream = getClass().getResourceAsStream("/log4j.properties"); 
        props.load(configStream); 
        configStream.close(); 
    } catch (IOException e) { 
        System.out.println("Errornot laod configuration file "); 
    } 
    props.setProperty("log4j.appender.controlTable.File", logFile); 
    LogManager.resetConfiguration(); 
    PropertyConfigurator.configure(props);

現在,我可以動態登錄到不同的文件了。 希望它也能幫助其他人。

您的解決方案對我來說似乎不是一個很好的解決方案,因為:

  1. Appender對您的日志記錄代碼不再透明
  2. 如果您要登錄不同的位置,那將變得非常混亂,您需要logEntries位置找到一個公共位置來存儲該logEntries

考慮編寫您的自定義Appender(我敢打賭,您幾乎可以復制RollingFileAppender內部的內容,但只需將觸發條件從文件大小更改為寫入的記錄數即可。

RollingFileAppender進行了簡短的查看。 似乎可以對其進行擴展,並覆蓋subAppend()方法。

public class RowCountRollingFileAppender extends FileAppender {
    // constructors
    // getter setters
    private maxEntries = 10;      // provided through config

    private currentEntries = 0;

    public void rollOver() {
        currentEntries = 0;
        super.rollOver();
    }
    protected void subAppend(LoggingEvent event) {
         super.subAppend(event);
         currentEntries++;
         if (fileName != null 
                 && qw != null 
                 && currentEntries > maxEntries) {
             rollOver();
         }
    }
}

然后,您可以擁有一個追加程序,如果文件達到最大大小,或者記錄了n消息,則該追加程序將翻轉。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM