Jboss logger在线程生命周期内清除MDC

时间:2019-05-17 10:57:26

标签: multithreading mdc jboss-logging

我需要使用jboss logger和logstash改进在wildfly上运行的JavaEE应用程序中的日志记录,我正在使用MDC存储userID,但是由于我是线程使用的新手,因此我不知道如何清除MDC线程被回收

我找到了清除MDC的不同方法,但是我想我缺少有关线程的一些知识...: 我试图扩展Thread:

public class MdcThread extends Thread {
    LoggingTools loggingTools = new LoggingTools(MdcThread.class);

    @Override
    public void run() {
        loggingTools.info("MdcThread");
        MDC.clear();
    }
}

我尝试扩展ThreadPoolExecutor:

public class MdcThreadPoolExecutor extends ThreadPoolExecutor {
    static LoggingTools loggingTools = new LoggingTools(MdcThreadPoolExecutor.class);

...constructors...

    @Override
    public void execute(Runnable command) {
        super.execute(wrap(command));
    }

    public static Runnable wrap(final Runnable runnable) {
        return new Runnable() {
            @Override
            public void run() {
                try {
                    runnable.run();
                } finally {
                    loggingTools.info("Mdc clear");
                    MDC.clear();
                }
            }
        };
    }
}

但是这些都不被称为...所以我假设ThreadPoolExecutor是一种使用线程的方法,但不一定使用吗?如何达到线程的生命周期?

1 个答案:

答案 0 :(得分:0)

如果您使用的是Backback,那么WildFly或JBoss Log Manager将不会管理MDC。 MDC的大多数实现,由于您使用的是Logback,因此我假设您使用的是org.slf4j.MDC,它们是线程本地的,因此MDC.clear()仅清除该线程MDC映射上的映射。看看slf4j的MDC manual

如果要清除消息诊断上下文,则需要在添加线程的同一线程中进行操作,以添加要清除的数据。