2016-08-29 36 views
0

メインプロセスがforkしたプロセスごとに別々のログファイルを作成したいとします。 log4j2.xmlでforkしたjavaプロセスごとに別々のlog4j2ログを作成します。

、ログファイル名は次のように宣言されています。最初のクラスでは

fileName="${sys:loggingFileName}.log" 

、ログが作成され、クラスAを言う:

public class A { 
    System.setProperty ("loggingFileName", "MyLogA"); 
    log = LogManager.getLogger (A.class); 
    ... 
    log.info (...); 
    ProcessBuilder pb = new ProcessBuilder(); 
    Map<String, String> environment; 
    environment = pb.environment(); 
    environment.put ("CLASSPATH", System.getProperty ("java.class.path")); 
    pb.command (Arrays.asList ("/usr/bin/java", "class B")); 
    final Process process = pb.start(); 
} 

クラスBが正確に見ることができます上記のように(Aの代わりにBを、Cを新しいクラスの作成のために適切に置き換えて)

ProcessBuilderを使用せずに別々に起動すると、クラスAとクラスBは、それぞれ別々のログを期待どおりに作成します。

ただし、クラスBがProcessBuilderを使用してクラスAからforkされると、指定されたログエントリを含むMyLogA.logファイルが作成されますが、MyLogB.logは含まれません。

なぜか分かりません。どんな指導も高く評価されます。

はさらに:変更せずに、前pb.startに

pb.redirectOutput (Redirect.INHERIT); 
pb.redirectError (Redirect.INHERIT); 

または

pb.redirectErrorStream (true); 

:私は置くことを試してみました。

+0

直接実行するときは、コマンドラインで '-D'オプションで何かを渡しますか? – RealSkeptic

+0

いいえ、プロセスはパラメータなしで開始するように設計されており、すべてlog4j.xmlファイルから取得されます。 –

+0

Windowsの場合は、CLASSPATH環境変数が影響しないことがあります。コマンド引数( 'Arrays.asList("/usr/bin/java "、" -classpath "、System.getProperty(" java.class.path ")、" class B ")で渡すべきです。 – RealSkeptic

答えて

0

特定のログファイルにログをリダイレクトするために、プロセスビルダを開始する前に、以下のコード行を使用してください。

Process p = null; 

ProcessBuilder pb = new ProcessBuilder(......); 

File logFile = new File("path to file/nameOfFile"); 

logFile.createNewFile(); 
      pb.redirectErrorStream(Boolean.TRUE).redirectOutput(Redirect.appendTo(logFile)); 

p = pb.start(); 

これは、すぐpb.startが呼び出されると、このファイルへのプロセスからすべてのログをリダイレクトスタートを作成します。

+0

これはうまくいくようですが、なぜlog4j2ストリームが同じように動作しないのですか? –

関連する問題