slf4j 始终使用 NOPMDCAdapter

Wiz*_*ard 6 java log4j slf4j mdc

我使用 slf4j 登录我的项目。我想使用 MDC 来记录用户 ID 参数。所以我检查教程和文档,并编写如下代码:

MDC.put("key", userId)
Run Code Online (Sandbox Code Playgroud)

userId实际上是一个字符串。

我使用常用​​的 log4j xml 和附加程序等属性。在那里添加 %X{key} 但没有任何反应。我根本没有看到任何东西可以代替 %X{key},但其他参数如 %-5p 或 %c 效果很好。

所以我使用 debug 来观察 MDC.put() 方法中发生的情况,并发现在 MDC 的初始化中使用了:

MDCAdapter mdcAdapter;
mdcAdapter = StaticMDCBinder.SINGLETON.getMDCA();
Run Code Online (Sandbox Code Playgroud)

IDEA 中的调试显示它具有“Log4jMDCAdapter”,类似于 MDCAdapter 的实现之一。但后来我查看 StaticMDCBinder,有如下代码:

public MDCAdapter getMDCA() {
   return new NOPMDCAdapter();
}
Run Code Online (Sandbox Code Playgroud)

那么 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

Wiz*_*ard 1

问题解决了。它是对项目中使用的其他库的超越依赖。即slf4j-jcl,我将部分添加到maven pom中,现在工作正常。