slf4j总是使用NOPMDCAdapter

时间:2013-01-16 12:49:40

标签: java log4j slf4j mdc

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

MDC.put("key", userId)

userId实际上是一个字符串。

我使用我常用的log4j xml和appenders等属性。添加%X {key}但没有任何反应。我根本没有看到代替%X {key}的任何内容,但其他参数如%-5p或%c效果很好。

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

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

IDEA中的调试显示它具有“Log4jMDCAdapter”,就像MDCAdapter的实现之一。 但后来我看看StaticMDCBinder,并且代码如下:

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

那么slf4j如何可以用适当的适配器初始化MDC,例如log4j ???我没弄明白。因为它总是使用NOPMDCAdapter,所以它无法在MDC中存储任何内容,并且无法在日志记录中显示它。我怎么能解决它?

在classpath中我有:

  • 的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

2 个答案:

答案 0 :(得分:1)

问题解决了。 这是项目中使用的其他图书馆的超然依赖。即slf4j-jcl,我将部分添加到maven pom中,现在它可以正常工作。

答案 1 :(得分:0)

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 的回答中所述,如果您的类路径中有两个 StaticMDCBinder 类,tomcat 将选择其中一个。

slf4j-simple 确实有一个默认为 NO-OP 适配器的 StaticMDCBinder,因此删除 slf4j-simple jar 应该可以解决这里的问题。