[英]Creating multiple log instances using log4j to output log files in separate locations
您好StackOverflow社區,
我正在編寫一個多線程應用程序,其中需要使用log4j為每個線程輸出日志文件。 理想情況下,我想為每個線程運行一個單獨的日志實例。 我正在就如何解決這個問題進行辯論。 因為每個日志實例的文件輸出位置都不同,所以我需要為每個實例更新log4j.appender.BrokerFile.File=
屬性。 到目前為止,我正在嘗試創建一個新的Logger,將新屬性設置為properties對象,然后使用PropertyConfigurator.configure(log4jProperties);
將新屬性加載到我新創建的Logger對象中PropertyConfigurator.configure(log4jProperties);
雖然可以很好地創建新的Logger實例,但是新實例似乎無法識別新屬性。 我是否需要為每個新的Logger實例創建一個新的FileAppender?
public class Broker implements Runnable{
private Settings ss; //The Settings object associated with this broker.
private String loggerName = null;
private Logger log = null;
private Properties log4jProperties = new Properties();
}
//Constructor
public Broker(Settings ss){
this.ss = ss;
}
public void run() {
loggerName = ss.getBrokerName() + "_Logger";
log = Logger.getLogger(loggerName);
log4jProperties.setProperty("log4j.loggerName", "DEBUG, FILE");
log4jProperties.setProperty("log4j.appender.FILE","org.apache.log4j.FileAppender");
log4jProperties.setProperty("log4j.appender.FILE.File", "C:/Logz/"+loggerName+".out");
log4jProperties.setProperty("log4j.appender.FILE.ImmediateFlush", "true");
log4jProperties.setProperty("log4j.appender.FILE.Threshold", "DEBUG");
log4jProperties.setProperty("log4j.appender.FILE.Append", "FALSE");
log4jProperties.setProperty("log4j.appender.FILE.layout", "org.apache.log4j.PatternLayout");
log4jProperties.setProperty("log4j.appender.FILE.layout.conversionPattern", "%m%n");
PropertyConfigurator.configure(log4jProperties);
log.debug("This is a debug message");
// This will be set to true as long as the Broker is running
while(isRunnable){
//Listen for and process files
}
}
這是控制台輸出。 如您所見,正在創建新的記錄器實例,但未識別新的屬性。
log4j:WARN No appenders could be found for logger (Broker1_Logger).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
log4j:WARN No appenders could be found for logger (Broker2_Logger).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
log4j:WARN No appenders could be found for logger (Broker3_Logger).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
每個經紀人都會這樣。 有什么方法可以將我的配置設置直接應用於Logger對象? 例如,類似log .PropertyConfigurator.configure(log4jproperties); 必須有一種方法將配置設置應用於創建的每個記錄器對象。
謝謝,
吉姆
似乎有必要為每個新實例創建一個新的附加程序,因為每個實例都需要打印到不同的文件輸出位置。 我通過創建帶有必要參數的generateLogger()方法來以編程方式創建新的記錄器和附加器來解決此問題。 如果您會注意到第一個參數包含父記錄器的名稱。 如果我在新的記錄器名稱中包括此名稱,它將繼承其父項的屬性,該屬性在我的master.properties文件中配置,反之亦然。 例如,如果我的父記錄器是“ Broker”,而我的記錄器名稱是“ Broker1”,則完整的loggerName將是“ Broker.Broker1”。 這樣,我可以在一個日志文件中跟蹤所有代理,同時在各自的文件輸出位置中為每個代理具有單獨的日志文件。 更不用說,此方法可以使用不同的父記錄器與許多不同類型的日志重復使用。 盡管您可以選擇甚至不需要父級Logger。 如果您選擇沒有父Logger,只需從方法中將其刪除,而忽略我的master.properties文件。
public Logger generateLogger(String parent, String name, String logDirectory, String filePattern, String fileThreshold) {
// TODO Auto-generated method stub
//Create Logger
String loggerName = parent + "." + name;
Logger log = Logger.getLogger(loggerName);
//Create Logging File Appender
RollingFileAppender fileApp = new RollingFileAppender();
fileApp.setName("Broker." + loggerName + "_FileAppender");
fileApp.setFile(logDirectory +"/"+ name+".log");
fileApp.setLayout(new PatternLayout(filePattern));
fileApp.setThreshold(Level.toLevel(fileThreshold));
fileApp.setAppend(true);
fileApp.activateOptions();
log.addAppender(fileApp);
return log;
}
這是我的master.properties文件中的Broker記錄器配置,以供參考。
log4j.logger.Broker=DEBUG, BrokerFile
# Broker Appenders
# Broker File Appender
log4j.appender.BrokerFile=org.apache.log4j.RollingFileAppender
log4j.appender.BrokerFile.File=C:/Documents and Settings/gr2cher/My Documents/KTLO/Java/CMInbound/BrokerLogs/Logs/Broker.log
log4j.appender.BrokerFile.MaxFileSize=1MB
log4j.appender.BrokerFile.MaxBackupIndex=1
log4j.appender.BrokerFile.layout=org.apache.log4j.PatternLayout
log4j.appender.BrokerFile.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n
log4j.appender.BrokerFile.threshold=DEBUG
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.