前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Spring Cloud Sleuth的MDC集成实现自定义跟踪

Spring Cloud Sleuth的MDC集成实现自定义跟踪

原创
作者头像
堕落飞鸟
发布2023-04-12 07:32:00
发布2023-04-12 07:32:00
1.8K00
代码可运行
举报
文章被收录于专栏:飞鸟的专栏飞鸟的专栏
运行总次数:0
代码可运行

Spring Cloud Sleuth是一个基于Spring Cloud的分布式跟踪解决方案。它使用了Google Dapper的思想,通过在服务调用链路上添加唯一的traceId和spanId来追踪请求的流转情况。而MDC(Mapped Diagnostic Context)则是log4j和logback等日志框架中的一个功能,它可以在日志输出时动态添加一些关键信息,便于问题的定位和排查。

MDC的基本用法

在介绍如何使用Spring Cloud Sleuth的MDC集成之前,我们先来了解一下MDC的基本用法。MDC是一种将上下文信息与线程绑定的机制。在Java中,可以通过ThreadLocal实现MDC。在log4j和logback等日志框架中,可以通过MDC来记录上下文信息,例如traceId、spanId等。下面是一个简单的例子:

代码语言:javascript
代码运行次数:0
运行
复制
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.slf4j.MDC;

public class MdcExample {
    private static final Logger logger = LoggerFactory.getLogger(MdcExample.class);

    public static void main(String[] args) {
        MDC.put("traceId", "123456");
        logger.info("Hello, world!");
        MDC.clear();
    }
}

在上面的例子中,我们使用MDC.put方法将traceId设置为"123456",然后使用logger.info方法输出日志,最后使用MDC.clear方法清空MDC。在输出的日志中,我们可以看到traceId的值已经被动态添加了进去。

Spring Cloud Sleuth的MDC集成

Spring Cloud Sleuth的MDC集成,可以将traceId和spanId等信息自动添加到MDC中,从而实现自定义跟踪。默认情况下,Spring Cloud Sleuth会将traceId和spanId分别命名为"traceId"和"spanId",并添加到MDC中。我们可以通过配置来修改这些默认值。下面是一个简单的配置示例:

代码语言:javascript
代码运行次数:0
运行
复制
spring:
  sleuth:
    mdc:
      keys: traceId, spanId, foo

在上面的配置中,我们将默认的"traceId"和"spanId"改为了自定义的值,并添加了一个名为"foo"的自定义字段。这些字段将被自动添加到MDC中,从而方便我们在日志中查看。

除了配置之外,我们还需要在代码中手动添加一些MDC的信息。可以使用Spring Cloud Sleuth提供的Tracer接口来获取traceId和spanId等信息,然后将它们添加到MDC中。下面是一个简单的示例:

代码语言:javascript
代码运行次数:0
运行
复制
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.slf4j.MDC;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.sleuth.Tracer;
import org.springframework.stereotype.Component;

@Component
public class MyService {
    private static final Logger logger = LoggerFactory.getLogger(MyService.class);

    @Autowired
    private Tracer tracer;

    public void doSomething() {
        String traceId = tracer.currentSpan().traceIdString();
        String spanId = tracer.currentSpan().spanIdString();
        MDC.put("traceId", traceId);
        MDC.put("spanId", spanId);
        MDC.put("foo", "bar");
        logger.info("Hello, world!");
        MDC.clear();
    }
}

在上面的示例中,我们使用@Autowired注解注入了Tracer接口,然后在doSomething方法中获取了当前的traceId和spanId,并将它们添加到MDC中。同时,我们还添加了一个名为"foo",值为"bar"的自定义字段。最后,在输出日志之后,我们清空了MDC。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Spring Cloud Sleuth的MDC集成
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档