springboot整合dubbo设置全局唯一ID进行日志追踪的示例代码

下面就是 "springboot整合dubbo设置全局唯一ID进行日志追踪的示例代码" 的详细攻略。

先了解基本概念

在介绍示例代码之前,先了解一下基本概念,有助于更好地理解实现过程:

  • Dubbo:一种高性能、轻量级的远程服务框架,支持 RPC 协议和多种注册中心。
  • TraceId:一条调用链路的唯一标识,常用于日志追踪,用于串联业务流程的各个步骤。
  • MDC(Mapped Diagnostic Context):即映射线程诊断上下文,是用来存放诊断上下文信息的 Map,一般用于记录日志、监控等场景。

示例代码

示例一:设置TraceId(log4j2版本)

  1. 引入log4j2依赖包
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-slf4j-impl</artifactId>
    <version>2.13.0</version>
</dependency>
  1. 在log4j2.xml文件中加入%d{traceId},即可在日志中打印TraceId
<?xml version="1.0" encoding="UTF-8"?>
<Configuration>
  <Appenders>
    <Console name="ConsoleAppender" target="SYSTEM_OUT">
      <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss,SSS} %-5p [%t] %c:%L - %m%n{traceId}" />
    </Console>
  </Appenders>
  <Loggers>
    <Root level="INFO">
      <AppenderRef ref="ConsoleAppender" />
    </Root>
  </Loggers>
</Configuration>
  1. 在服务provider的DubboFilter类中创建TraceId,并放入MDC中
public class DubboFilter implements Filter {
    private final static String traceIdKey = "traceId";
    @Override
    public Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {
        String traceId = UUID.randomUUID().toString();
        MDC.put(traceIdKey, traceId);
        try {
            return invoker.invoke(invocation);
        } finally {
            MDC.remove(traceIdKey);
        }
    }
}
  1. 在服务consumer的DubboFilter类中获取TraceId,放入MDC中
public class DubboFilter implements Filter {
    private final static String traceIdKey = "traceId";
    @Override
    public Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {
        String traceId = MDC.get(traceIdKey);
        if (StringUtils.isBlank(traceId)) {
            traceId = UUID.randomUUID().toString();
            MDC.put(traceIdKey, traceId);
        }
        try {
            return invoker.invoke(invocation);
        } finally {
            MDC.remove(traceIdKey);
        }
    }
}

示例二:设置TraceId(logback版本)

  1. 引入logback依赖包
<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-classic</artifactId>
    <version>1.2.3</version>
</dependency>
  1. 在logback.xml文件中加入%X{traceId},即可在日志中打印TraceId
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
  <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <encoder>
      <pattern>%d{yyyy-MM-dd HH:mm:ss,SSS} %highlight(%-5level) %logger{15}.%M :%L - %msg%n%X{traceId}</pattern>
    </encoder>
  </appender>

  <logger name="com.xxxx" level="DEBUG" additivity="false">
    <appender-ref ref="STDOUT" />
  </logger>

  <root level="INFO">
    <appender-ref ref="STDOUT" />
  </root>
</configuration>
  1. 在服务provider的DubboFilter类中创建TraceId,并放入MDC中
public class DubboFilter implements Filter {
    private final static String traceIdKey = "traceId";
    @Override
    public Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {
        String traceId = UUID.randomUUID().toString();
        MDC.put(traceIdKey, traceId);
        try {
            return invoker.invoke(invocation);
        } finally {
            MDC.remove(traceIdKey);
        }
    }
}
  1. 在服务consumer的DubboFilter类中获取TraceId,放入MDC中
public class DubboFilter implements Filter {
    private final static String traceIdKey = "traceId";
    @Override
    public Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {
        String traceId = MDC.get(traceIdKey);
        if (StringUtils.isBlank(traceId)) {
            traceId = UUID.randomUUID().toString();
            MDC.put(traceIdKey, traceId);
        }
        try {
            return invoker.invoke(invocation);
        } finally {
            MDC.remove(traceIdKey);
        }
    }
}

总结

以上就是 "springboot整合dubbo设置全局唯一ID进行日志追踪的示例代码" 的完整攻略。在Dubbo服务框架中,通过在服务提供者和消费者中增加一个DubboFilter来设置和获取TraceId,并在日志中打印,从而实现了服务调用的日志追踪和排查。关于TraceId的具体实现和在日志中打印的方法,可以根据实际情况进行调整和修改。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:springboot整合dubbo设置全局唯一ID进行日志追踪的示例代码 - Python技术站

(0)
上一篇 2023年5月20日
下一篇 2023年5月20日

相关文章

  • java equals函数用法详解

    Java equals函数用法详解 介绍 在Java中,equals()是用来比较两个对象是否相等的函数。equals()方法是Object类中的方法,因此所有Java类都包含equals()方法。在默认情况下,equals()方法比较对象的引用地址是否相同,即两个对象是否是同一个实例。但是,我们可以覆盖equals()方法,来定义自己的相等规则。 equa…

    Java 2023年5月26日
    00
  • javaweb页面附件、图片下载及打开(实现方法)

    下面是详细讲解“javaweb页面附件、图片下载及打开(实现方法)”的完整攻略: 1. 附件下载 实现方法 创建一个下载链接或按钮,设置其href属性为要下载的文件资源的url地址,如下所示: <a href="/attachments/file.pdf">下载</a> 在后端处理器中,根据url地址获取文件资源,…

    Java 2023年6月15日
    00
  • 安装Zookeeper和Kafka集群

    安装Zookeeper和Kafka集群 本文介绍如何安装Zookeeper和Kafka集群。为了方便,介绍的是在一台服务器上的安装,实际应该安装在多台服务器上,但步骤是一样的。 安装Zookeeper集群 下载安装包 从官网上下载安装包: curl https://dlcdn.apache.org/zookeeper/zookeeper-3.7.1/apac…

    Java 2023年4月17日
    00
  • kafka topic 权限控制(设置删除权限)

    Kafka是一个分布式流处理平台,提供了强大的消息队列功能,它的漏洞和配置不良问题可能会导致未授权访问和数据泄露等问题。本篇攻略将详细介绍如何对Kafka Topic进行权限控制,并设置删除权限,帮助您避免可能的安全隐患。 准备工作 在开始本攻略之前,需要确保您已经完成以下准备工作: 安装Kafka。 创建一个Kafka集群。 熟悉Kafka Topic基本…

    Java 2023年6月2日
    00
  • Java系统变量参数获取设置System.getProperties()的方法

    使用Java的System类提供了访问系统级别变量的方法,其中包括了Java系统变量。可以使用System.getProperties()方法来获取当前Java虚拟机的系统属性和变量,并可以进行进一步操作。 具体步骤如下: 1. 使用System.getProperties()方法获取Java系统变量 可以使用以下代码获取Java虚拟机的所有系统变量: Pr…

    Java 2023年6月15日
    00
  • Spring Mvc中传递参数方法之url/requestMapping详解

    Spring MVC中传递参数方法之URL/RequestMapping详解 在Spring MVC中,我们可以通过URL和RequestMapping来传递参数。本文将详细介绍Spring MVC中传递参数的方法,并提供两个示例说明。 URL传递参数 在Spring MVC中,我们可以通过URL来传递参数。以下是一个简单的URL传递参数示例,它将参数id传…

    Java 2023年5月17日
    00
  • 在JS中a标签加入单击事件屏蔽href跳转页面

    在JS中,我们可以通过添加单击事件来屏蔽a标签的href跳转页面。下面是实现这个功能的完整攻略: 使用addEventListener函数添加单击事件 我们可以通过addEventListener函数来为a标签添加单击事件,代码如下: document.querySelector(‘a’).addEventListener(‘click’, function…

    Java 2023年6月15日
    00
  • 什么是反射?

    反射 反射是在运行时动态地发现和使用类的信息的机制。Java 反射机制提供了程序在运行时拥有访问并操作任何一个对象、变量、方法的能力。 Java 反射最初被设计出来是为了支持类浏览器这样的工具。在此基础上,JavaBean等技术也得以广泛应用。 反射的使用 在Java中,使用反射需要经过如下基本步骤:1. 获取需要使用的类的Class对象;2. 根据Clas…

    Java 2023年5月10日
    00
合作推广
合作推广
分享本页
返回顶部