SLF4J PUT和Immediate Get失败 [英] SLF4J put and immediate get is failing
问题描述
我为SLF4J MDC编写了一个小包装。
import org.slf4j.MDC;
import java.util.UUID;
public final class MdcWrapperUtility {
public static final String MDC_TRANSACTION_ID_KEY_NAME = "MDC_TRANSACTION_ID";
private MdcWrapperUtility() {
}
public static String getId() {
String threadName = Thread.currentThread().getName();
String returnValue = MDC.get(MDC_TRANSACTION_ID_KEY_NAME);
return returnValue;
}
public static String setId() {
String threadName = Thread.currentThread().getName();
String uuid = UUID.randomUUID().toString();
String setAndReturnValue = threadName + uuid;
MDC.put(MDC_TRANSACTION_ID_KEY_NAME, setAndReturnValue);
String sanityCheck = MDC.get(MDC_TRANSACTION_ID_KEY_NAME);
if (null == sanityCheck || sanityCheck.length() <= 0)
{
throw new NullPointerException("MDC did not persist. How is this even happening?????");
}
return setAndReturnValue;
}
}
首先,在我调用";setID()";之后,我会在稍后调用&getID";,它将为空。
您可以看到,我确实验证了线程名称...了解线程是允许MDC工作的魔力。
所以我在MDC.put之后立即执行了一个MDC.get,结果返回为空。
?
Gaaa。
在我的概念验证项目中:
implementation group: 'org.slf4j', name: 'slf4j-api', version: slf4jVersion
implementation group: 'org.slf4j', name: 'slf4j-simple', version: slf4jSimpleVersion
具体版本如下:
slf4jSimpleVersion = '1.7.30'
slf4jVersion = '1.7.30'
概念验证和&QOOT;REAL&QOOT;都给我一个空的MDC.get(也就是,我得到的";MDC没有持续。这是怎么发生的?&q;例外。
我能提供的唯一另一条线索是,我没有一块巨石。 我有一个多模块Gradle项目。
https://docs.gradle.org/current/userguide/multi_project_builds.html
我的版本使用变量(在我的根build.gradle中定义),因此在任何模块中都没有不匹配的版本。
追加一项:
好的,现在我知道它为什么返回NULL了。 它使用的是具体public class NOPMDCAdapter implements MDCAdapter {
public void clear() {
}
public String get(String key) {
return null;
}
public void put(String key, String val) {
}
public void remove(String key) {
}
public Map<String, String> getCopyOfContextMap() {
return null;
}
public void setContextMap(Map<String, String> contextMap) {
// NOP
}
}
......
推荐答案
好的,我想出来了。
当然,事后诸葛亮也是如此。
我应该更多地关注";‘slf4j-Simple’";的";Simple";部分
这(实际上)不支持MDC,它转到NOPMDCAdapter。
当我为SLF4J(如Logback)添加";Real";混凝土时,我获得";Real";MDC功能。
因此删除";Simple";并添加";Real";one(如Logback)
implementation group: 'ch.qos.logback', name: 'logback-classic', version: logbackClassicVersion
implementation group: 'org.slf4j', name: 'slf4j-api', version: slf4jVersion
logbackClassicVersion = '1.2.3'
现在我使用我的";Get";获得了MDC。
我添加‘Logback-Classic’引用后的&Quot;Contra&Quot;MDCAdapter变成了下面的引用,这实际上是有效的。
public class LogbackMDCAdapter implements MDCAdapter {
}
重要文档金块:
(出自http://www.slf4j.org/manual.html)
映射诊断上下文(MDC)支持 本质上是由日志框架维护的映射,其中 应用程序代码提供键-值对,然后可以将其插入 通过日志消息中的日志记录框架。MDC数据也可以高度 有助于筛选邮件或触发某些操作。 SLF4J支持MDC或映射的诊断上下文。如果基础 日志框架提供MDC功能,然后SLF4J将委托 到底层框架的MDC。请注意,目前只有log4j 和Logback提供MDC功能。如果底层框架 不提供MDC,例如,java.util.Logging,那么SLF4J将 仍然存储MDC数据,但其中的信息需要 由自定义用户代码检索。 因此,作为SLF4J用户,您可以在 存在log4j或Logback,但不强制这些日志记录 框架依赖于您的用户。
这篇关于SLF4J PUT和Immediate Get失败的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!