2016-08-05 2 views
0

log4j2を使用してログをコンソールに、複数のスレッドのファイルに書き込みます。別のスレッドからの行を混ぜる代わりに、私はワーカースレッドのログを保持し、ワーカースレッドがメインスレッドに参加するときにそれらをフラッシュするだけです。どうやってやるの?代わりのようなログを持つ例えばlog4j2:ワーカースレッドがメインスレッドに参加した後のログのログ

、:

Thread 1 started. 
Thread 2 started. 
Thread 1 working... 
Thread 2 working... 
Thread 1 working... 
Thread 2 working... 
Thread 1 finished. 
Thread 2 finished. 

私が持っているしたいと思います:

Thread 1 started. 
Thread 1 working... 
Thread 1 working... 
Thread 1 finished. 
Thread 2 started. 
Thread 2 working... 
Thread 2 working... 
Thread 2 finished. 

答えて

0
  1. は、スレッドごとLoggerオブジェクトを定義します。ロガーの
  2. (1)から、ByteArrayOutputStreamインスタンスを渡し、(1)からロガーにWriterAppenderを追加し、ログの通過までの階層(falseに設定された加法)
  3. を無効にします。
  4. スレッドを接合した後
  5. OutputStream(3)で定義され得る。例えば応じ

それに対処:

public static void main(String[] args) throws Exception{ 
    BasicConfigurator.configure(); 
    LoggerRunner[] runners = new LoggerRunner[]{new LoggerRunner("t1"), new LoggerRunner("t2")}; 
    Thread t1 = new Thread(runners[0]); 
    Thread t2 = new Thread(runners[1]); 
    t1.start(); 
    t2.start(); 
    t1.join(); 
    System.out.println("Joined 1"); 
    t2.join(); 
    System.out.println("Joined 2"); 
    System.out.print(new String(runners[0].getLog())); 
    System.out.print(new String(runners[1].getLog())); 
} 

private static class LoggerRunner implements Runnable{ 

    private final Logger logger; 

    private ByteArrayOutputStream logs = new ByteArrayOutputStream(); 
    private final String name; 
    public LoggerRunner(String name){ 
     this.name = name; 
     logger = Logger.getLogger(name); 
     logger.setAdditivity(false); 
     logger.addAppender(new WriterAppender(new PatternLayout("%-1r [%t] %-5p %c %x - %m%n"), logs)); 
    } 

    public byte[] getLog(){ 
     return logs.toByteArray(); 
    } 

    @Override 
    public void run() { 
     logger.info(name + " started"); 
     try{ 
      Thread.sleep(1000); 
      logger.info(name + " working"); 
      Thread.sleep(1000); 
     }catch(Exception e){} 
     logger.info(name + " finished"); 
    } 
} 
+0

このように、私はにスレッド固有のロガーを通過しなければなりませんどこにでもログを書く必要があります。 log4j2はこれを内部的に処理する方法を提供していますか? – Fan

+0

あなたは何を意味するのかよく分かりません。上の例では、ログに記録されたデータが最初の呼び出しスレッドに返されます。これを避けるには、 'run'実装の完了時にログを出力することで回避できます。複数のスレッドのログを衝突させないようにするには、実際にロックを獲得するログアウト – copeg

+0

私は現在静的なロガーを使用しています。しかし、あなたの答えでは、私はすべてのスレッドのロガーを作成し、他のクラス/メソッドに渡す必要があります。別の方法があるかどうか疑問に思うだけです。 – Fan

関連する問題