必须在run方法之前,否则等异步线程执行的时候有可能MDC里面的值已经被清空了,这个时候就会返回nullMap<String, String> context = MDC.getCopyOfContextMap();super.execute(() -> {// 将父线程的MDC内容传给子线程if(context !=null) {
// 请求处理完成后,清除MDC中的traceId,以免造成内存泄漏 TraceIdUtil.clear(); } } 此处解释下为什么要先从header中获取,如果没有再重新生成。因为考虑到如今很多项目采用微服务架构或上下游节点很多时,为了全流程的日志追踪,建议保持traceId一致,这样更方便日志排查。如果微服务项目中使用了Skywalking或ELK等日志系统时...
通过上述配置,SpringBoot应用将自动为每个请求生成一个唯一的TraceId,并将其传递给各个服务节点。为了确保TraceId的唯一性和复杂度,我们可以在拦截器中进行进一步的处理。例如,可以在拦截器中检查客户端是否提供了TraceId,如果没有提供,则生成一个UUID作为TraceId: importjavax.servlet.Filter;importjavax.servlet.FilterChain;...
在Spring Boot项目的pom.xml文件中添加Logback的依赖(通常Spring Boot默认就包含了Logback,所以这一步可能是可选的)。 配置Logback: 在src/main/resources目录下创建或修改logback-spring.xml文件,配置日志的输出格式和滚动策略等。在配置中,需要确保日志格式中包含TraceId。 xml <configuration> <!-- 其...
异步方法的日志打印traceId 异步方法会开启一个新线程,我们想要是异步方法和主线程共用同一个traceId,首先先新建一个任务适配器MdcTaskDecorator。 publicclassMdcTaskDecoratorimplementsTaskDecorator{@OverridepublicRunnabledecorate(Runnablerunnable){Map<String,String>map=MDC.getCopyOfContextMap();return()->{try{MDC...
MDC 使用1、添加拦截器public class LogInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { //如果有上层调用就用上层的ID String traceId = request.getHeader(Constants.TRACE_ID); ...
0. 日志打印添加traceid, 每次请求有不同的traceId 1. 引入springboot的aop, web <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <version>2.3.4.RELEASE</version> </dependency> <dependency> ...
这样在收集的日志文件中就可以看到每行日志有一个tracceId值,每个请求的值都不一样,这样我们就可以根据traceId查询过滤出一次请求的所有上下文日志了。 项目推荐:基于SpringBoot2.x、SpringCloud和SpringCloudAlibaba企业级系统架构底层框架封装,解决业务开发时常见的非功能性需求,防止重复造轮子,方便业务快速开发和企业...
MDC使用 1、添加拦截器 代码语言:javascript 复制 publicclassLogInterceptorimplementsHandlerInterceptor{@OverridepublicbooleanpreHandle(HttpServletRequest request,HttpServletResponse response,Object handler)throws Exception{//如果有上层调用就用上层的IDString traceId=request.getHeader(Constants.TRACE_ID);if(traceId==...
MDC.clear(); } } 2.2 使用JWT token过滤器的项目 springboot项目经常使用spring security+jwt来做权限限制,在这种情况下,我们通过新建filter过滤器来设置traceId,那么在验证token这部分的日志就不会带上traceId,因此我们需要把代码放在jwtFilter中,如图: