5

プロジェクトへのログインに slf4j を使用しています。また、ユーザー ID パラメーターのログ記録に MDC を使用したいと考えています。だから私はチュートリアルとドキュメントをチェックし、次のようなコードを作成します:

MDC.put("key", userId)

userId は実際には文字列です。

そして、私は通常の log4j xml をアペンダーなどのプロパティで使用します。そこに %X{key} を追加しますが、何も起こりません。%X{key} の代わりに何も表示されませんが、%-5p や %c などの他のパラメーターはうまく機能します。

だから私はデバッグを使用してMDC.put()メソッドで何が起こるかを見て、MDCの初期化で使用されていることを見つけました:

MDCAdapter mdcAdapter;
mdcAdapter = StaticMDCBinder.SINGLETON.getMDCA();

IDEA でデバッグすると、MDCAdapter の実装の 1 つのような "Log4jMDCAdapter" があることがわかります。しかし、次に StaticMDCBinder を確認すると、次のようなコードがあります。

public MDCAdapter getMDCA() {
   return new NOPMDCAdapter();
}

では、slf4j が log4j などの適切なアダプターを使用して MDC を初期化できる可能性はありますか ??? わかりませんでした。常に NOPMDCAdapter を使用するため、MDC に何も保存できず、ログに表示できません。どうすれば修正できますか??

クラスパスには次のものがあります:

  • log4j-1.2.16.jar
  • slf4j-api-1.6.1.jar
  • slf4j-api-1.6.2.jar
  • slf4j-jcl-1.6.2.jar
  • slf4j-log4j12-1.6.2.jar
4

2 に答える 2

1

SLF4J の MDC は、基礎となるロガーに基づいて MDC の適切な実装を切り替えるための単なるファサードです。ロガーから適切な MDCAdapter が見つからない場合、NO-OP アダプターにフォールバックします。このために、StaticMDCBinder という名前のクラスを見つけようとします https://github.com/qos-ch/slf4j/blob/v_1.7.25/slf4j-api/src/main/java/org/slf4j/MDC.java#L99

したがって、この場合、@Wizzardの回答で述べたように、クラスパスに2つの StaticMDCBinder クラスがある場合、Tomcatはそのうちの1つを選択します。

slf4j-simple には、デフォルトで NO-OP アダプターになる StaticMDCBinder があるため、slf4j-simple jar を削除すると、ここで問題が解決するはずです。

于 2021-06-18T13:16:09.053 に答える
0

問題が解決しました。プロジェクトで使用する他のライブラリからの超越的な依存関係でした。つまり、slf4j-jcl、一部を maven pom に追加すると、正常に動作するようになりました。

于 2013-01-17T07:57:35.593 に答える