簡體   English   中英

使用log4j創建多個日志實例以在單獨的位置輸出日志文件

[英]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.

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