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 ファイルで構成されている親のプロパティを継承し、その逆も同様です。たとえば、親ロガーが「Broker」でロガー名が「Broker1」の場合、完全な loggerName は「Broker.Broker1」になります。このようにして、すべてのブローカーを 1 つのログ ファイルで追跡しながら、ブローカーごとに個別のファイル出力場所に個別のログ ファイルを保持することもできます。言うまでもなく、このメソッドは、さまざまな親ロガーを使用してさまざまな種類のログで再利用できます。選択した場合でも、親ロガーは必要ありません。親 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 logger 構成を次に示します。

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 に答える