刨油秸鬃1、pom.xml 依赖
复制代码
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-starter-test
test
org.springframework.boot
spring-boot-starter-logging
org.projectlombok
lombok
1.16.10
复制代码
2、整合logback,打印日志,logback.xml (日志配置文件)
关键代码:[traceId:%X{traceId}],traceId是通过拦截器里MDC.put(traceId, tid)添加。
复制代码
${log}/%d{yyyy-MM-dd}.log
30
10MB
复制代码
3、application.yml指定logback.xml配置目录
logging:
config: classpath:logback.xml
4、异步线程的跟踪ID链路追踪
业务逻辑是基于线程数据的传递进行处理,主线程传递线程ID到子线程。处理方式:重写线程池的execute(*)、submit(*)方法。
复制代码
public final class MyThreadPoolTaskExecutor extends ThreadPoolTaskExecutor {
public MyThreadPoolTaskExecutor() {
super();
}
@Override
public void execute(Runnable task) {
super.execute(TraceIdUtil.wrap(task, MDC.getCopyOfContextMap()));
}
@Override
public Future submit(Callable task) {
return super.submit(TraceIdUtil.wrap(task, MDC.getCopyOfContextMap()));
}
@Override
public Future submit(Runnable task) {
return super.submit(TraceIdUtil.wrap(task, MDC.getCopyOfContextMap()));
}
}
复制代码
4、异步定时任务线程接口ScheduledExecutorService的日志链路追踪。在执行前,执行后进行跟踪ID的生成和删除。
复制代码
@Bean(name = "scheduledExecutorService")
protected ScheduledExecutorService scheduledExecutorService() {
return new ScheduledThreadPoolExecutor(corePoolSize,
new BasicThreadFactory.Builder().namingPattern("schedule-pool-%d").daemon(true).build(),
new ThreadPoolExecutor.CallerRunsPolicy()) {
@Override
protected void beforeExecute(Thread thread, Runnable runnable) {
super.beforeExecute(thread, runnable);
// 为定时任务生成一个 traceId
TraceIdUtil.setTraceId();
// 可选:添加任务标识
System.out.println("Scheduled task starting with traceId: " + TraceIdUtil.getTraceId());
}
@Override
protected void afterExecute(Runnable r, Throwable t) {
super.afterExecute(r, t);
Threads.printException(r, t);
TraceIdUtil.remove();
}
};
}
1442

被折叠的 条评论
为什么被折叠?



