プロジェクトで log4cxx を使用していますが、[%t] マーカーを使用して現在のスレッド ID をログに記録できます。プロセス ID または log4j をログに記録する方法は?
ConversionPattern と xml ベースの構成ファイルを使用しています。
ありがとう、
上記の回答に基づいて、次のように log4j でこれを行います。
import java.lang.management.*;
import org.apache.log4j.MDC;
private String getPID() {
RuntimeMXBean rt = ManagementFactory.getRuntimeMXBean();
return rt.getName();
}
private void configLog4j() {
// call this from somewhere before you start logging
MDC.put("PID", getPID());
}
次に、私のlog4j.propertiesで:
log4j.appender.FILE.layout.ConversionPattern=%d %X{PID} [%t] %p %c{1} %x - %m%n
これにより、少なくとも私の Java の実装では、ID 番号とホスト名で構成される PID が実際に生成されます。さらに進んで、PID だけを分割することもできます。
log4j と log4cxx のドキュメントを調べましたが、プロセス ID のログ記録に関する情報はどこにも見つかりませんでした。
要するに、いいえ、少なくとも直接ではなく、プロセス ID をログに記録することはできません。
C++ を使用しているため、プログラムの PID を取得できます。Linux(このリンクのUbuntu)でそれを行う方法は次のとおりです。Windowsでの方法は次のとおりです。
プログラムの開始時にその PID を取得し、MDCを使用して PID をその中に入れます。
もっと良い方法はないと思います。
実行中のプログラムが標準の Java クラスを使用して PID を取得する方法を私は知らないので、log4j でこれを行うのはさらに厄介です。
これはどの log4xxx にも存在しませんが、少し努力すれば自分で作成できます。少しのコーディングを気にしなければ、実際には非常に簡単な作業です。これは基本的に私が数回行ったことです-実際のアペンダーをオーバーライドするか、レイアウトです。クラスがプロセスIDをイベントプロパティマップに貼り付けることを確認してください。次に、このプロパティを MDC プロパティであるかのように名前で使用します。上記のように MDC を直接使用することは、最適な選択ではありません。これらはスレッドにバインドされており、すべてのスレッドが開始時に PID を設定する必要があるためです。しかし、アペンダーやレイアウトをオーバーライドできない、またはオーバーライドしたくない場合は、おそらくこれが唯一のオプションです。