0

你好 StackOverflow 社区,

我正在编写一个多线程应用程序,其中我需要使用 log4j 为每个线程输出一个日志文件。理想情况下,我希望为每个线程运行一个单独的日志实例。我正在讨论我应该如何解决这个问题。因为每个日志实例的文件输出位置不同,所以我需要更新log4j.appender.BrokerFile.File=每个实例的属性。截至目前,我正在尝试创建一个新的 Logger,将新属性设置为属性对象,然后使用将新属性加载到我新创建的 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); 必须有一种方法可以将配置设置应用于创建的每个记录器对象。

谢谢你,

吉姆

4

1 回答 1

1

似乎有必要为每个新实例创建一个新的附加程序,因为每个实例都需要打印到不同的文件输出位置。我通过创建带有必要参数的 generateLogger() 方法来解决这个问题,以编程方式创建新的记录器和附加程序。如果您会注意到第一个参数包含父记录器的名称。如果我将它包含在我的新记录器名称中,它将继承其父级的属性,该属性在我的 master.properties 文件中配置,反之亦然。例如,如果我的父 logger 是“Broker”并且我的 logger 名称是“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
于 2013-09-12T17:38:22.963 回答