SpringBoot入门教程 日志TraceId

本文介绍了日志TraceId的使用场景,如便于请求日志排查和微服务链路跟踪。讲解了MDC(Mapped Diagnostic Context)的概念,并在SpringBoot中通过过滤器、拦截器和AOP设置日志TraceId。同时,还讨论了如何在异步方法中获取主线程的TraceId。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一:日志TraceId使用场景

1.1 场景一

工作中根据日志排查问题时我们经常想看到某个请求下的所有日志,可是由于生产环境并发很大,每个请求之间的日志并不连贯,互相穿插,如果在打印日志时没有为日志增加一个唯一标识是没法分辨出那些日志是那个请求打印的。

1.2 场景二

在微服务场景下,我们想知道一个请求中所有和该请求相关的链路日志,此时也需要为日志增加一个唯一标识。通常可以使用UUID或者其它雪花算法等作为唯一标识。

二:MDC

MDC(Mapped Diagnostic Context)映射诊断环境,是 log4j 和 logback 提供的一种方便在多线程条件下记录日志的功能,可以看成是一个与当前线程绑定的ThreadLocal,可以往其中添加键值对。

public class MDC {
   
   
  // 添加key-value
  public static 
### 创建自定义拦截器以添加 Trace Id 为了在 Spring Boot 应用程序中创建自定义拦截器并实现 `traceId` 的功能,可以按照以下方式操作: #### 添加依赖项 确保项目的 `pom.xml` 文件中有必要的依赖项。对于日志记录和 Web 开发的基础需求,通常需要引入 Spring Boot Starter Web 和 Lombok(可选)。如果计划使用 AOP 来增强功能,则还需要加入相应的 starter。 ```xml <dependencies> <!-- Other dependencies --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId*lombok*</artifactId> <optional>true</optional> </dependency> </dependencies> ``` #### 实现自定义拦截器类 通过继承 `HandlerInterceptorAdapter` 或者实现 `HandlerInterceptor` 接口来自定义拦截器逻辑。这里采用后者的方式来进行更灵活的操作。 ```java import org.slf4j.MDC; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class TraceIdLoggingInterceptor implements HandlerInterceptor { private static final String TRACE_ID = "traceId"; @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { // Generate a unique trace ID for each incoming HTTP request. String traceId = UUID.randomUUID().toString(); // Put the generated trace ID into MDC so that it can be included in log messages. MDC.put(TRACE_ID, traceId); return true; // Continue with the execution of other interceptors and controllers. } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { // Remove the trace ID from MDC once processing is complete to avoid memory leaks. MDC.remove(TRACE_ID); } } ``` 此代码片段展示了如何为每个进入 `/users/*` 路径的请求生成唯一 `traceId` 并将其放置于 MDC 中[^1]。 #### 注册拦截器至应用程序上下文中 为了让上述拦截器生效,还需注册它到 Spring MVC 配置里。可以通过重写 `addInterceptors()` 方法完成这一步骤。 ```java @Configuration public class WebConfig implements WebMvcConfigurer { @Autowired private TraceIdLoggingInterceptor traceIdLoggingInterceptor; @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(traceIdLoggingInterceptor).addPathPatterns("/users/**"); } } ``` 以上设置使得每当有请求访问匹配模式下的 URL (`/users/**`) 时,都会触发 `TraceIdLoggingInterceptor.preHandle()` 方法,在其中执行 `traceId` 的分配工作。 #### 使用虚拟线程优化异步任务处理 (可选) 如果有意利用 Java 新特性——虚拟线程来改进性能表现的话,可以根据特定条件加载配置类 `ThreadVirtualConfig` ,从而让异步任务运行在线程池中的虚拟线程上[^3]。 ```java @Configuration @ConditionalOnProperty(prefix = "spring.threads.virtual", name = "enabled", havingValue = "true") public class ThreadVirtualConfig { /** * 自定义虚拟线程任务执行器 Bean 定义。 * * @return 返回一个新的 {@link CustomVirtualThreadTaskExecutor} 实例。 */ @Bean public Executor taskExecutor() { return new CustomVirtualThreadTaskExecutor(); } } ``` 注意:这部分属于高级主题,并不是构建基本 `traceId` 功能所必需的部分;仅当确实考虑到了多线程环境下的跟踪问题才建议深入研究。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

风流 少年

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值