为了方便线程池管理,打算在线程日志输出时,增加一个线程ID,找到了一个可行的方法
这篇博客里面通过使用线程池的装饰器,从而使用了MDC, 但是有些线程池并没有装饰器,比如ThreadPoolTaskScheduler
然后我又看到了这么一个东西
通过复写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}"