可能ですが、事前に構成されたパターンを使用するだけでは簡単ではありません。
Log4j 1.X と Log4j 2.x には、スレッド ID を出力するための事前構成されたパターンはありませんが、いつでも「魔法のトリック」を使用できます。
PatternLayout
PatternParser
クラスとしてマークされfinal
、キーとして「パターン」、値としてクラスの静的マップを持つクラスを使用しConverters
ています。Parses がパターン フォーマットをログに記録するために使用するパターンを見つけるたびに%
、マップ内のこのパターン キーに一致するコンバーターが使用されます。
そのマップに独自のルールを追加することはできませんが、独自の MyOwnPatternLayout を記述することはできます。
public class MyOwnPatternLayout extends PatternLayout
そのformat
方法でそのようなトリックを行います:
public String format(LoggingEvent event) {
String log = super.format(event);
/*
Now you just have to replace with regex all occurences of %i or
any mark you would like to use as mark to represent Thread ID
with Thread ID value.
Only thing you have to be sure to not use any mark as your Thread ID
that already is defined by PatterParser class
*/
return log.replaceAll("%i", someThreadID);
}
唯一の問題は、何らかの方法でそのスレッド ID を取得する必要があることです。場合によっては、簡単に収集できるスレッド名を解析するだけで済みます。
String threadName = event.getThreadName();
たとえば、Apache-Tomcat はスレッド名http-nio-/127.0.0.1-8084"-exec-41の末尾にスレッド ID を配置します。
スレッド ID が正しいことを確認するには、LogginEvent と Logger (MyLoggingEvent と MyLogger) の独自のサブクラスを作成し、MyLogger 内で MyLoggingEvent ウィッチを作成して、スレッド名だけでなくスレッド ID も引数として取ります。次に、上記のコードで簡単に収集できます。