為了方便線程池管理,打算在線程日志輸出時愕难,增加一個線程ID,找到了一個可行的方法
這篇博客里面通過使用線程池的裝飾器,從而使用了MDC, 但是有些線程池并沒有裝飾器呛凶,比如ThreadPoolTaskScheduler
然后我又看到了這么一個東西
通過復寫execute 方法來使用MDC, 那么最后我統(tǒng)合了一下行贪,就得到了三個類
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));
}
}
如果執(zhí)行了其他方法把兔,需要復寫相應(yīng)方法并且裝飾 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} 就是我們設(shè)置的日志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