我为 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,它返回为空。
???
嘎嘎。
在我的概念验证项目中,我有:
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'
概念验证和“真实”都给了我一个空 MDC.get(又名,我得到“MDC 没有持续存在。这怎么会发生??????”异常。
我能提供的唯一其他线索是我没有巨石。我有一个多模块 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
}
}
…………