1

マルチスレッド方式で複数のファイルを処理するアプリケーションに取り組んでいます。分析は、分析する必要のあるファイルごとに1つのスレッドを開始し、一連のステップ(さまざまなクラス)を実行して、すべて何らかの形式のログ出力を生成することによって行われます。

分析するファイルごとに、そのファイルのメッセージのみを含む専用のログファイルが必要です。私が今使用しているコードは、プログラムがまだシングルスレッドであるときに書かれました。

    PatternLayout layout = new PatternLayout("%d{dd MMM yyyy HH:mm:ss,SSS} [%t] %-5p %C{1} %x - %m%n");
    if(Config.CREATE_SEPERATE_LOG)
    {

        FileAppender appender;
        try {
            String path = (Config.LOGFILE_PATH!=null)?Config.LOGFILE_PATH:filename;
            appender = new FileAppender(layout,path);
            appender.setErrorHandler(new FallbackErrorHandler());
            appender.setName("Dedicated Appender");
            org.apache.log4j.Logger.getRootLogger().addAppender(appender);
        } catch (IOException e) {
            org.apache.log4j.Logger.getLogger(Config.class).warn("Failed to create a dedicated log "+filename, e);
        }
    }

これにより、基本的に、分析中のファイル専用のログファイルに書き込む追加のアペンダーが作成されます。アプリケーションがシングルスレッドだった当時は機能していましたが、混乱していました。

設定を変更して、各クラスが特定のファイルの分析に参加し、そのファイルの特定のログファイルにログを記録できるようにするにはどうすればよいですか。

4

2 に答える 2

1

私はそれをしません。各スレッドの名前 (またはプレフィックス + 名前) を設定するだけです。
次に、log4jPatternLayoutを使用して、スレッド名が出力されるように各ログ行をフォーマットします。
%tスレッド名のフォーマット記号です。PatternLayout ドキュメント
の詳細情報:

変換パターンを「%-5p [%t]: %m%n」とし、log4j 環境が PatternLayout を使用するように設定されているとします。

私の経験では、必要に応じてスレッド名を考慮するスクリプトを使用して、後でスレッド ログを個別のファイルに分割する方が便利です。

于 2013-02-27T12:04:21.613 に答える
0

あなたの質問を正しく理解できたかどうかはわかりませんが、スレッドごとにカスタムロガーが必要であると私は信じています。各スレッドは、独自のログ ファイルを指す必要があります。その場合、スレッド クラス レベルでロガー インスタンスを実装/初期化することになります。

public class MyThread  implements Runnable{
    private Logger logger =null;
public MyThread(){
    FileAppender appender =null;
    //custom initialisation code for specific appender/file
    logger =  // initialise 
}

@Override
public void run() {
    // TODO Auto-generated method stub

}

private void warn(String message){
    logger.warn(message);
}
private void info(String message){
    logger.info(message);
}

}

于 2013-02-27T11:51:23.667 に答える