然后就是把项目运行起来(一个简单的springboot项目,配了一个我们扩展后的线程池MDCThreadExecutor,构造函数传了一个map,map里放了一个key-value,即mdc-threadPool,然后下面是线程池的一些参数,然后还有我们的线程名是walking-mdc开头的) @BeanpublicMDCThreadExecutor taskExecutor(){ MDCThreadExecutor mdcThreadExecuto...
以线程池传递数据为例,ThreadPoolTaskExecutor提供了一个taskDecorator装饰器,通过这个属性,我们就可以实现属性的传递。首先,定义一个MDCContextDecorator,然后设置线程池的taskDecorator属性,最后 MDC的使用其实很简单,对于我们查询日志也很有帮助,应用也算是非常广泛了。有兴趣的同学也可以去看一下它的内部实现,代...
然后就是把项目运行起来(一个简单的springboot项目,配了一个我们扩展后的线程池MDCThreadExecutor,构造函数传了一个map,map里放了一个key-value,即mdc-threadPool,然后下面是线程池的一些参数,然后还有我们的线程名是walking-mdc开头的) @BeanpublicMDCThreadExecutortaskExecutor(){MDCThreadExecutor mdcThreadExecutor=...
在原来版本中新起线程时MDC会自动将父线程的MDC内容复制给子线程,因为MDC内部使用的是InheritableThreadLocal,但是因为性能问题在最新的版本中被取消了,所以子线程不会自动获取到父线程的MDC内容。官方建议我们在父线程新建子线程之前调用MDC.getCopyOfContextMap()方法将...
线程mdc打点工具类代码 配置logback 输出的日志格式,要输出mdc里定义的traceId 配置webMVC使用MDC打点 定义MvcTraceInterceptor,来拦截http请求进行mdc打点 使用自定义的MvcTraceInterceptor 配置ThreadPoolTaskExecutor使用MDC打点 配置ApacheHttpClient使用MDC打点 测试MDC日志打点效果 ...
初见MDC 前两天看项目中的代码,无意中看到一个自定义的线程池 MDCThreadExecutor extends ThreadPoolTaskExecutor 主要针对spring-context中的ThreadPoolTaskExecutor线程池进行了扩展,但也没做多少扩展,仅仅是引入了两个属性,如下: privateMap<String, String> threadContext;privateBoolean useThreadContext;publicMap<Strin...
封装ThreadMdcUtil工具类 以封装Callable为例: 判断当前线程对应MDC的Map是否存在,如果存在则设置子线程的ContextMap为当前线程的; 如果不存在,则重新生成traceId; 执行run方法 public final class ThreadMdcUtil { public static void setTraceIdIfAbsent() { ...
MDC.clear(); } }; } } 测试子线程中traceId的传递,本项目中ExecutorService已经重写了线程池 @RestController@RequestMapping("trace")@Slf4j@AllArgsConstructorpublicclassTestTraceController{privatefinalExecutorService executorService;@GetMapping("traceLog")publicStringtraceLog(){ ...
Size, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory) { super(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue, threadFactory); } @Override public void execute(Runnable command) { Map<String, String> map = MDC....
SLF4J的MDC SLF4J 提供了MDC ( Mapped Diagnostic Contexts )功能,它的实现也是利用了 ThreadLocal 机制。在代码中,只需要将指定的值 put 到线程上下文的 Map 中,然后在对应的地方使用 get 方法获取对应的值,从而达到自定义和修改日志输出格式内容的目的。