SpringBoot使用TraceId日志链路追踪的代码实现

 更新时间:2025年07月17日 09:25:28   作者:喵手  
有时候一个业务调用链场景,很长,调了各种各样的方法,看日志的时候,各个接口的日志穿插,确实让人头大,为了解决这个痛点,就使用了TraceId,根据TraceId关键字进入服务器查询日志中是否有这个TraceId, 本文给大家介绍了SpringBoot使用TraceId日志链路追踪的方法

前言

大家好!今天我们来聊聊如何在 SpringBoot 应用中使用 TraceId 来进行日志链路追踪。你是否曾经在排查系统问题时,遇到过日志过多、难以找到根源的情况?尤其是在微服务架构中,一个请求可能会涉及多个服务,日志若不做追踪,会让问题排查变得非常麻烦。TraceId 正是为了解决这个问题而存在的!

我相信很多开发者都有过这样的烦恼:在复杂的分布式系统中,一个请求会涉及到多个服务,日志堆积如山,排查问题时根本无从下手。这时,如果每个日志都能够标记上统一的 TraceId,问题追踪将变得高效多了。那么,今天我们就来聊一聊如何在 SpringBoot 中实现 TraceId 的日志链路追踪,轻松搞定问题排查!

TraceId是什么?

TraceId 是一个全局唯一的标识符,通常用来追踪请求在系统中的整个生命周期。尤其是在分布式系统中,多个微服务会相互调用,每次请求的处理都会生成新的日志。如果我们为每个请求分配一个唯一的 TraceId,并将其贯穿到各个服务的日志中,就可以非常方便地追踪一个请求的所有处理过程。

通过 TraceId,你可以轻松定位问题,查看每个请求的执行路径,简化排查过程,尤其是在高并发的环境下,日志会变得有序而有意义。

如何在SpringBoot中实现TraceId?

好了,废话不多说,接下来就进入正题——如何在 SpringBoot 项目中实现 TraceId 进行日志链路追踪呢?

1. 引入所需依赖

首先,我们需要引入一些必要的依赖。为了实现 TraceId 链路追踪,我们通常使用 Spring Cloud Sleuth,它能够帮助我们生成并传递 TraceId,同时还可以与日志框架(如 SLF4J、Logback 等)结合,进行日志追踪。

pom.xml 中加入以下依赖:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-sleuth</artifactId>
</dependency>

记得在 pom.xml 文件中还要设置 Spring Cloud 的版本,保证兼容性。

2. 配置日志

接下来,我们要配置日志格式,让每条日志都能显示 TraceId。假设你使用的是 Logback 作为日志框架,可以在 src/main/resources 目录下的 logback-spring.xml 配置文件中设置日志输出格式。

<configuration>
    <property name="LOG_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss} %-5level %logger{36} - %msg%n%throwable"/>

    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>${LOG_PATTERN}</pattern>
        </encoder>
    </appender>

    <root level="info">
        <appender-ref ref="console"/>
    </root>

    <!-- Spring Cloud Sleuth 自带的 TraceId 输出 -->
    <logger name="org.springframework.cloud.sleuth" level="INFO" />
</configuration>

在这里,我们没有做太多复杂的格式,只是简单地配置了日志输出的基本格式,你可以根据需求修改。如果你希望在日志中包含 TraceId 信息,可以将 %X{X-B3-TraceId} 加入日志的格式化模式中。

<pattern>%d{yyyy-MM-dd HH:mm:ss} %-5level %logger{36} - %msg [TraceId: %X{X-B3-TraceId}]%n</pattern>

这样,每条日志都会显示 TraceId,方便你在分布式环境中追踪请求。

3. 使用 TraceId

Spring Cloud Sleuth 会自动为每个请求生成一个唯一的 TraceId,并在每次请求的日志中输出它。你可以通过以下代码获取当前的 TraceId。

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.sleuth.Tracer;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class TraceIdController {

    @Autowired
    private Tracer tracer;

    @GetMapping("/trace")
    public String trace() {
        // 获取当前的 TraceId
        String traceId = tracer.currentSpan().context().traceId();
        return "当前 TraceId: " + traceId;
    }
}

在上面的例子中,我们通过 Tracer 获取当前请求的 TraceId,并将其返回给前端。每次访问 /trace 接口时,都会返回当前请求的 TraceId。

4. 测试与验证

一切配置完成后,你可以通过启动 SpringBoot 应用来验证 TraceId 是否生效。打开浏览器,访问 /trace 接口,你应该能看到返回的 TraceId。接着,查看应用的日志输出,每一条日志后面应该都能看到对应的 TraceId。

如果你使用的是多服务架构,当服务 A 调用服务 B 时,服务 B 的日志也会带上服务 A 的 TraceId,这样就能实现跨服务的日志追踪。

其他注意事项

在分布式系统中,TraceId 的传递不仅仅局限于日志输出,还涉及到跨服务的请求。为了确保 TraceId 能够在服务之间传递,你可以在服务调用时,将 TraceId 作为 HTTP 请求头的一部分传递。例如:

import org.springframework.cloud.sleuth.Tracer;
import org.springframework.http.HttpHeaders;
import org.springframework.web.client.RestTemplate;

@Autowired
private RestTemplate restTemplate;

@Autowired
private Tracer tracer;

public void callAnotherService() {
    String traceId = tracer.currentSpan().context().traceId();
    HttpHeaders headers = new HttpHeaders();
    headers.add("X-B3-TraceId", traceId);
    
    // 将 TraceId 添加到请求头
    HttpEntity<String> entity = new HttpEntity<>(headers);
    restTemplate.exchange("http://localhost:8081/anotherService", HttpMethod.GET, entity, String.class);
}

这样,跨服务调用时,X-B3-TraceId 就会被自动带上,确保服务间的 TraceId 不会丢失。

总结

通过 Spring Boot 和 Spring Cloud Sleuth,我们可以非常方便地在应用中实现 TraceId 的日志链路追踪,帮助我们更好地进行问题排查。借助 TraceId,我们可以将日志统一标记,并追踪请求在系统中的生命周期。无论是单一服务还是微服务架构,TraceId 都能显著提高开发者的调试效率,轻松定位问题。

现在,你已经掌握了在 SpringBoot 中实现 TraceId 的方法了,是不是觉得日志追踪变得轻松多了呢?

以上就是SpringBoot使用TraceId日志链路追踪的代码实现的详细内容,更多关于SpringBoot TraceId日志链路追踪的资料请关注脚本之家其它相关文章!

相关文章

  • springboot+springsecurity+mybatis+JWT+Redis 实现前后端离实战教程

    springboot+springsecurity+mybatis+JWT+Redis 实现前后端离实战教程

    这篇文章主要介绍了springboot+springsecurity+mybatis+JWT+Redis 实现前后端离实战教程,需要的朋友可以参考下
    2024-01-01
  • springboot如何为web层添加统一请求前缀

    springboot如何为web层添加统一请求前缀

    这篇文章主要介绍了springboot如何为web层添加统一请求前缀,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-02-02
  • 关于ZooKeeper的会话机制Session解读

    关于ZooKeeper的会话机制Session解读

    这篇文章主要介绍了关于ZooKeeper的会话机制Session解读,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-02-02
  • Java枚举(Enum)从基础到高级应用详解

    Java枚举(Enum)从基础到高级应用详解

    文章详细介绍了Java枚举(enum)的概念、基础语法、内置方法及高级用法,强调了枚举在提高代码类型安全性、可读性和维护性方面的优势,文中还列举了添加字段、方法和实现接口等高级用法,并提供了命名规范、不可变性、异常处理等最佳实践建议,需要的朋友可以参考下
    2026-05-05
  • springboot整合quartz实现定时任务示例

    springboot整合quartz实现定时任务示例

    spring支持多种定时任务的实现。我们来介绍下使用spring的定时器和使用quartz定时器,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。
    2017-04-04
  • Java结构型模式之门面模式详解

    Java结构型模式之门面模式详解

    门面模式又叫外观模式(Facade Pattern),主要用于隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口,本文通过实例代码给大家介绍下java门面模式的相关知识,感兴趣的朋友一起看看吧
    2023-02-02
  • SSM框架搭建图文教程(推荐)

    SSM框架搭建图文教程(推荐)

    下面小编就为大家带来一篇SSM框架搭建图文教程(推荐)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-09-09
  • 配置javaw.exe双击运行jar包方式

    配置javaw.exe双击运行jar包方式

    这篇文章主要介绍了配置javaw.exe双击运行jar包方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-01-01
  • Properties操作如何保存到属性文件

    Properties操作如何保存到属性文件

    这篇文章主要介绍了Properties操作保存到属性文件的相关知识,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-06-06
  • MyBatis 配置之集合的嵌套方式

    MyBatis 配置之集合的嵌套方式

    这篇文章主要介绍了MyBatis 配置之集合的嵌套方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-09-09

最新评论