0

私はレガシーロギングクラスを持っています。静的ロガー参照 (logger という名前) と一連の静的メソッドがあります。

各メソッドは String 入力を受け取り、それを System.out.println に書き込み、logger が null でない場合は logger に書き込みます。

ロガーを初期化するコンストラクターを取得しました。しかし、このコンストラクターにはパッケージ スコープしかなく、どこにも呼び出されていないと確信しています。したがって、logger は常に null であり、クラスは基本的に System.out.println のみを実行します。

これを変更して、各スレッドが独自の FileAppender に書き込むマルチスレッド アプリケーションで使用できるようにします。

そして、それが私が立ち往生しているところです。

基本的に、私がやりたいことは、この静的クラスをさまざまな log4j FileAppenders に関連付けることです。各 FileAppender は Thread によって作成でき、ファイル名は Thread が認識している一意の情報から導出できます。

どうすればよいかわかりませんが、魔法のように Log4j を使用して、そのスレッドの一意の FileAppender をこのレガシー ロギング クラスに伝達することです。

アイデア?ヒント?提案?

マーク

4

1 に答える 1

0

RoutingAppender と ThreadContext マップを使用して、対象のログ ファイル名を動的に変更することができます。

これはすべて構成で行うことができます (スレッドが FileAppender を作成するカスタム コードは必要ありません)。RoutingAppender 構成では、ターゲット FileAppender を切り替えるために使用する ThreadContext キーを指定できます。たとえば、文字列「ROUTINGKEY」を使用できます。各スレッドは、キー「ROUTINGKEY」の ThreadContext マップに一意の値を設定し、この値を使用して、ログ イベントがルーティングされるアペンダーを選択します。ファイル名に ROUTINGKEY 値を含むログ ファイルを動的に作成するように設定することもできるため、すべてのターゲット ログ ファイルを事前に把握しておく必要はありません。

FAQ ページに良い例があります: http://logging.apache.org/log4j/2.x/faq.html#separate_log_files

于 2013-10-19T03:54:32.157 に答える