Java线程池使用MDC

为了方便线程池管理,打算在线程日志输出时,增加一个线程ID,找到了一个可行的方法

https://blog.csdn.net/GravityQ/article/details/110864607

这篇博客里面通过使用线程池的装饰器,从而使用了MDC, 但是有些线程池并没有装饰器,比如ThreadPoolTaskScheduler

然后我又看到了这么一个东西

https://cloud.tencent.com/developer/ask/98982

通过复写execute 方法来使用MDC, 那么最后我统合了一下,就得到了三个类

public class MdcTaskDecorator  {

    public static   Runnable decorate(Runnable runnable) {
        Map contextMap = MDC.getCopyOfContextMap();
        return () -> {
            try {
                if (contextMap != null) {
                    MDC.setContextMap(contextMap);
                }
                MDC.put("LOG_ID", IdUtil.objectId());
                runnable.run();
            } finally {
                MDC.clear();
            }
        };
    }
}

public class MdcThreadPoolTaskExecutor extends ThreadPoolTaskExecutor {

    @Override
    public void execute(Runnable task) {
        super.execute(MdcTaskDecorator.decorate(task));
    }
}

如果执行了其他方法,需要复写相应方法并且装饰 Runnable

public class MdcThreadPoolTaskScheduler extends ThreadPoolTaskScheduler {

    @Override
    public ScheduledFuture scheduleWithFixedDelay(Runnable task, Date startTime, long delay) {
        return super.scheduleWithFixedDelay(MdcTaskDecorator.decorate(task), startTime, delay);
    }

    @Override
    public ScheduledFuture schedule(Runnable task, Date startTime) {
        return super.schedule(MdcTaskDecorator.decorate(task), startTime);
    }


}

日志输出配置 其中 %X{LOG_ID} 就是我们设置的日志ID

logging:
  pattern:
    console: "%d{yyyy-MM-dd HH:mm:ss.SSS} %5p ${PID:-} --- [%t-%X{LOG_ID}] %-40.40logger{39} : %m%n{-%wEx}"
    file: "%d{yyyy-MM-dd HH:mm:ss.SSS} %5p ${PID:-} --- [%t-%X{LOG_ID}] %-40.40logger{39} : %m%n{-%wEx}"
image.png

你可能感兴趣的:(Java线程池使用MDC)