22

アプリケーションに関する情報を表示するための log4j を使用した Struts アプリケーションがあります。

ログの出力をフォーマットするパターンは次のとおりです。

log4j.appender.RALL.layout.ConversionPattern=[%p] %d{dd/MM/yyyy HH:mm:ss} [THREAD ID=%t] [CLASS=(%C{1}:%L)] %m%n 

ログにスレッド名ではなくスレッド IDを表示する必要があります。スレッド名を表示する変換文字は %t です。log4jのドキュメントには、それを取得する方法がありません。

誰でも私を助けることができますか??

4

10 に答える 10

10

可能ですが、事前に構成されたパターンを使用するだけでは簡単ではありません。

Log4j 1.X と Log4j 2.x には、スレッド ID を出力するための事前構成されたパターンはありませんが、いつでも「魔法のトリック」を使用できます。

PatternLayoutPatternParserクラスとしてマークされ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 も引数として取ります。次に、上記のコードで簡単に収集できます。

于 2013-01-16T14:21:14.840 に答える
8

これを行う 1 つの方法は、log4j MDC を使用して自分で追加することです。Web リクエストのユーザー名を追加するために使用します。これは、各リクエストの開始時にフィルターで行います。例えば。

import org.apache.log4j.MDC;

...

  // Add username to MDC
  String username = ...;
  MDC.put("user", username);

[%X{user}]次に、変換パターンに追加します。

于 2013-01-16T14:18:15.027 に答える
5

ThreadContext マップを使用して、メタデータを log4j2 に提供できます。これは、通常のフォーマットで追加できる値の文字列マップです。

String threadId = String.valueOf(Thread.currentThread().getId());
ThreadContext.put("TId", threadId);

そして、はるかに合理的なパターン:

    <PatternLayout pattern="%d{yyyyMMdd}T%d{HHmmss.SSS} %-5level [%t] [%5X{TId}] %15c{1} - %msg%n"/>

「魚のタグ付け」に関する完全な Log4j2 ドキュメント

于 2014-08-18T17:16:47.147 に答える
2

標準の log4j 形式でスレッド ID を表示することはできないと思います。また、クラスのコードを調べて、PatterParser役立つものは何も見つかりませんでした。%iいくつかのカスタム ソリューションを見つけましたが、オプションを持つ IBM サーバーに対してのみ:

%i: スレッド ID を挿入します。スレッド名 (%t で示される) とは異なり、これはスレッドの数値 ID です。このパラメーターは Initiate に固有のものであることに注意してください。ここにリストされている他のパラメーターは log4j の標準です。

このリンクを参照してください

于 2013-01-16T13:03:23.643 に答える