メインプロセスが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);
:私は置くことを試してみました。
直接実行するときは、コマンドラインで '-D'オプションで何かを渡しますか? – RealSkeptic
いいえ、プロセスはパラメータなしで開始するように設計されており、すべてlog4j.xmlファイルから取得されます。 –
Windowsの場合は、CLASSPATH環境変数が影響しないことがあります。コマンド引数( 'Arrays.asList("/usr/bin/java "、" -classpath "、System.getProperty(" java.class.path ")、" class B ")で渡すべきです。 – RealSkeptic