暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

MDC的注意事项

帝都的雁 2021-01-27
645

    为了方便定位问题,相信很多猿友都干过这件事:使用过滤器拦截请求,然后生成一个请求ID(唯一标识,如UUID),并将其放入ThreadLocal中。然后在执行业务代码时,通过日志将核心的信息或参数输出,同时输出threadLocal中记录的请求ID。这样一来,本次请求出现异常后,我们可以根据请求id查询日志,读取请求的整个过程,从而快速从庞大的日志文件中获取我们感兴趣的信息。

    log4j提供了MDC,本质上也是使用ThreadLocal进行保存。而且使用的是InheritableThreadLocal,即可继承的threadLocal。所以配置MDC去记录请求ID,简直不要太爽。

    但最近遇到个问题,某个业务场景发生异常,输出日志时,发现请求ID为null。既然请求ID记录在ThreadLocal中,那么怀疑是不是发生垃圾回收。毕竟ThreadLocalMap的key是弱引用。但是说不通啊,如果是这样,那ThrealLocal岂非太鸡肋?那就还有一种原因,异常的线程和记录请求ID的线程不是一个,也非父子关系。

    沿着这个思路继续查看代码,果不其然。异常的方法被@Async注解修饰,采用spring的异步线程池进行异步处理,而异步线程池中的线程和MDC没有任何关系,更遑论继承他的threadLocal值了。

   

欢迎大家和帝都的雁积极互动,头脑交流会比个人埋头苦学更有效!共勉!

CSDNhttps://blog.csdn.net/yxh13521338301


文章转载自帝都的雁,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论