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<String, String> 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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容