SLF4J PUT和Immediate Get失败 [英] SLF4J put and immediate get is failing

查看:13
本文介绍了SLF4J PUT和Immediate Get失败的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我为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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆