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 IO文件复制

    来给大家详细讲解一下如何用Java IO实现文件复制的操作。 1. Java IO简介 Java IO库提供了一组类和接口,用于执行输入和输出(I/O)以及序列化。I/O就是指通过网络或其他外部层面,传输控制台,文件或任何Java代码与外部世界交互的数据。Java IO库还包括两个包,即java.io和java.nio,用于处理不同类型的输入,输出和序列化。…

    Java 2023年5月20日
    00
  • SpringBoot概述及在idea中创建方式

    SpringBoot概述 Spring Boot是一个开源的Java框架,它摆脱了传统Spring框架的繁琐配置,建立在Spring Framework的基础之上。Spring Boot提供了一种快速简便的方式来搭建Java应用程序,并且默认设置对各种Spring组件、外部组件、配置管理等进行了很好的支持。 Spring Boot使用“约定大于配置”的方式来…

    Java 2023年5月15日
    00
  • Java日期时间操作的方法

    下面就给您介绍Java日期时间操作的方法的完整攻略。 1. 日期时间类 Java中有多种日期时间类,包括Date、Calendar、DateFormat、SimpleDateFormat、Instant等。其中,Date和Calendar是Java SE 1.1版本引入的,而Instant是Java SE 8版本新增的类。 1.1 Date类 java.ut…

    Java 2023年5月20日
    00
  • mac系统下载、安装、使用Java8教程

    Mac系统下载、安装、使用Java8教程 下载Java8 在Mac系统上下载Java8有两种方式: 1. Oracle官网下载 访问Oracle官网,找到对应的JDK版本并下载,具体下载步骤如下: 找到“Java SE Development Kit 8 Downloads”,点击“Download”按钮。 接受许可协议,选择对应的操作系统下载JDK安装包。…

    Java 2023年5月24日
    00
  • struts2+spring+hibernate分页代码[比较多]第1/7页

    下面我来为你详细讲解“struts2+spring+hibernate分页代码[比较多]第1/7页”的完整攻略。 概述 该攻略主要涉及到使用struts2、spring、hibernate等框架进行分页的操作。在该攻略中,我们将使用分页插件完成分页操作,具体实现过程如下。 步骤 引入分页插件 我们可以通过Maven引入pagehelper插件,具体配置如下:…

    Java 2023年5月20日
    00
  • jQuery ajax MD5实现用户注册即时验证功能

    下面是“jQuery ajax MD5实现用户注册即时验证功能”的完整攻略: 介绍 在用户注册过程中,我们希望用户在输入用户名或邮箱时,能够即时验证输入是否合法,避免用户提交无效数据。本教程将介绍如何使用jQuery ajax和MD5实现用户注册即时验证功能。 步骤 以下是实现该功能的大致步骤: 在HTML页面中添加用户名和邮箱的输入框以及一个用于显示验证结…

    Java 2023年6月16日
    00
  • java使用多线程读取超大文件

    以下是详细讲解 Java 使用多线程读取超大文件的完整攻略: 一、背景介绍 我们在处理大文件时,如果采用单线程读取文件,读取速度会非常慢,而且有可能会导致内存溢出。因此我们可以采用多线程的方式进行文件读取。 二、多线程读取文件 1. 读取文件流 首先,我们要将文件读入到内存中。这里我们使用 Java 的 FileInputStream 类来实现文件读取。示例…

    Java 2023年5月19日
    00
  • 详解Spring Security中的HttpBasic登录验证模式

    开发Web应用时,安全措施不可忽视,特别是对于需要用户登录的应用程序。Spring Security是一个功能强大的安全框架,它支持多种身份验证和授权方案。其中,HttpBasic登录验证模式是最简单的一种方式。本文将详细讲解Spring Security中的HttpBasic登录验证模式。 什么是HttpBasic登录验证模式 HttpBasic登录验证模…

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