いくつかの事前設定されたパターンを使用するだけでは簡単ではない可能性があります。
Log4j 1.XとLog4j 2.xには、スレッドIDを印刷するための事前設定済みのパターンはありませんが、いつでも「マジックトリック」を使用できます。
PatternLayout
final
クラスとしてマークされ、値としてキーとConverters
クラスとして「パターン」の静的な地図を有するPatternParser
クラスを使用しています。 Parsesが%
で始まるロギングパターンフォーマットを使用してパターンを検出するたびに、マップ内のこのパターンキーに一致するコンバーターを使用します。
あなたはそのマップに独自のルールを追加することはできませんが、あなたはまだあなた自身のMyOwnPatternLayoutを書き込むことができます。それにformat
方法だだろう
public class MyOwnPatternLayout extends PatternLayout
は、このようなトリックを行います
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はスレッド名の末尾にスレッドIDを入れのhttp-nio-/127.0.0.1-8084" -exec-41。
スレッドIDが正しいことを確認するには、LogginEventとLogger(MyLoggingEventとMyLogger)の独自のサブクラスを作成することもできます。MyLogger内でMyLoggingEventを作成すると、スレッドIDだけでなくスレッド名も取得します。そして、あなたはeasly上記のコードでそれを集めることができます。
申し訳ありませんが長い回答と私はこれが少なくともあなたにいくつかの助けを願っています。
てみましたか? – partlov
はい、試しましたが、以下のようにIBMサーバの場合にのみ有効です –
@partlovそれは私にとってはうまくいかず、 '%i'は認識できません。私はlog4j' 1.2.16'を使用しています。 –