[英]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);
現在,我可以動態登錄到不同的文件了。 希望它也能幫助其他人。
您的解決方案對我來說似乎不是一個很好的解決方案,因為:
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.