【问题标题】:slf4j always use NOPMDCAdapterslf4j 总是使用 NOPMDCAdapter
【发布时间】:2013-01-16 12:49:40
【问题描述】:

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

MDC.put("key", userId)

userId 实际上是一个字符串。

我使用我常用的 log4j xml 和附加器等属性。在那里添加 %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 中存储任何东西,也不能在日志中显示它。我该如何解决它??

在类路径中我有:

  • 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

【问题讨论】:

    标签: java log4j slf4j mdc


    【解决方案1】:

    SLF4J 的 MDC 只是基于底层 logger 切换 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 确实有一个 StaticMDCBinder,它默认为 NO-OP 适配器,因此删除 slf4j-simple jar 应该可以解决这里的问题。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 你能详细说明一下吗?你添加或排除“slf4j-jcl”吗?我有点困惑。
      • @granadaCoder ehm 现在我真的不记得了,可能我将排除添加到错误的超越版本并添加到正确版本的显式依赖项。
      • 我终于弄清楚了我的问题。未来的读者可能想看看这个答案:stackoverflow.com/questions/64787265/…
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-03-08
      • 2013-05-31
      • 2011-05-06
      • 1970-01-01
      • 2011-06-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多