我需要使用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是一种使用线程的方法,但不一定使用吗?如何达到线程的生命周期?
答案 0 :(得分:0)
如果您使用的是Backback,那么WildFly或JBoss Log Manager将不会管理MDC。 MDC的大多数实现,由于您使用的是Logback,因此我假设您使用的是org.slf4j.MDC
,它们是线程本地的,因此MDC.clear()
仅清除该线程MDC映射上的映射。看看slf4j的MDC manual。
如果要清除消息诊断上下文,则需要在添加线程的同一线程中进行操作,以添加要清除的数据。