问题描述
项目引入spring-cloud-starter-sleuth,发现有些自定义Filter以及线程池异步线程日志无traceId.容易在日志排查中忽略掉,从而影响日志分析.
原因分析以及解决方案
自定义Filter日志无traceId
-
原因(Filter优先级问题)
sleuth框架的filter优先级为以下值
image.png
image.png
-
解决方案
设置优先级高于上面的即可
image.png
线程池异步线程日志无traceId问题
- 原因
线程池实例不在spring容器管理时,sleuth框架无法做处理
如以下定义线程池方式不由spring管理
-
在类中声明为成员变量
image.png - 在方法中声明线程池
- 解决方案
- 在spring容器中注册线程池.如使用@Bean等
- 使用MDC获取再做处理(这个相对麻烦点,建议使用方法1)
String traceId = MDC.get("X-B3-TraceId");
String spanId = MDC.get("X-B3-SpanId");