首页 > 其他分享 >Dubbo实现分布式日志链路追踪

Dubbo实现分布式日志链路追踪

时间:2023-01-22 15:22:52浏览次数:43  
标签:Dubbo LOG TRACE dubbo mdc 链路 日志 ID

Dubbo实现分布式日志链路追踪

技术场景

在日常的开发、测试或运维的过程中,经常存在这样的场景,开发人员在代码中使用日志工具(log4j、slf4j)记录日志,比如请求ID、IP等,方便在线上快速、精准的定位问题,通过完整的日志链路清晰的进行信息定位。

一般的项目都是分层的、分布式的,在众多的日志信息中,如何区分哪些日志信息是同一请求发出来的,详细的实现如下。

技术框架

项目框架:Spring boot

分布式协调:Zookeeper、Dubbo

日志工具:Sf4j

构建工具:Maven

开发工具:IDEA

项目框架

mdc-dubbo-api:接口服务

mdc-dubbo-provider:服务端服务

mdc-dubbo-consumer:消费端服务

项目配置

mdc-dubbo-api

提供一个接口

public interface OrderService {

String getOrder(String orderid);

}

mdc-dubbo-consumer

在服务端,在Controller层使用MDC工具类放入一个TRACE_LOG_ID信息,在此请求的service层、mdc-dubbo-provider中使用该信息。

项目分为Controller、Service、Filter等各层:

Controller层:存放TRACE_LOG_ID, 打印

@GetMapping("get/{id}")

public String get(@PathVariable("id") String id){

    String uuid=UUID.randomUUID().toString().replaceAll("-", "");

    MDC.put(Constants.TRACE_LOG_ID, uuid);

    LOGGER.info("controller->param:{}", id);

    return consumerService.getName(id);

}

Service层:打印TRACE_LOG_ID

@Override

public String getName(String id) {

    LOGGER.info("consumer->service->param:{}", id);

    return orderService.getOrder(id);

}

Filter:

public class TraceFilter implements Filter {

@Override

public Result invoke(Invoker> invoker, Invocation invocation) throws RpcException {

    //从MDC中获取

    String logId=MDC.get(Constants.TRACE_LOG_ID);

    Map attachments=invocation.getAttachments();

    attachments.put(Constants.TRACE_LOG_ID, logId);

    return invoker.invoke(invocation);

}

需要过滤器配置在resources->MATE-INF->dobbo文件夹下

![过滤器配置

traceFilter=com.bestpay.provider.filter.TraceFilter

此处注意 此处使用到了Dubbo中spi机制,文件名必须是com.alibaba.dubbo.rpc.Filter

dubbo配置文件

   xmlns:xsi=""

   xmlns:dubbo=""

   xsi:schemaLocation="

   

   

   ">






















   xmlns:xsi=""

   xmlns:dubbo=""

   xsi:schemaLocation="

   

   

   ">

其中filter="traceFilter是引用dobbo目录下配置中的key

logback配置

[%date{yyyy-MM-dd HH:mm:ss}] [%-5level] %logger %line --%mdc{client} [%X{TRACE_LOG_ID}] %msg%n

UTF-8

TRACE_LOG_ID对应放入MDC中的key

mdc-dubbo-provider

配置和## mdc-dubbo-consumer类似,其中在Filter上稍微有些差别

public class TraceFilter implements Filter {

@Override

public Result invoke(Invoker> invoker, Invocation invocation) throws RpcException {

    String logId=invocation.getAttachment(Constants.TRACE_LOG_ID);

    MDC.put(Constants.TRACE_LOG_ID, logId);

    return invoker.invoke(invocation);

}

}

项目运行

mdc-dubbo-consumer日志:

[2018-12-19 10:16:56] [INFO ] com.bestpay.comsumer.controller.ConsumerController 33 – [d88ecba6581c47b1b3ade78d2821d13a] controller->param:223

[2018-12-19 10:16:56] [INFO ] com.bestpay.comsumer.service.impl.ComsumerServiceImpl 20 – [d88ecba6581c47b1b3ade78d2821d13a] consumer->service->param:223

mdc-dubbo-provider日志:

[2018-12-19 10:16:56] [INFO ] com.bestpay.provider.service.OrderServiceImpl 13 – [d8 provider->service->param:223

标签:Dubbo,LOG,TRACE,dubbo,mdc,链路,日志,ID
From: https://www.cnblogs.com/dituirenwu/p/17064454.html

相关文章

  • day27-单元测试/日志
    1.管理系统与服务器集成1.1准备工作【应用】需求对之前写过的信息管理系统进行改进,实现可以通过浏览器进行访问的功能准备工作将资料中的管理系统代码拷贝到当......
  • Promtail+Loki+Grafana搭建轻量级日志管理平台
    1.简介  现在几乎所有的服务都是分布式部署,在定位环境问题时,往往需要在不同的主机上查看日志,并且对于某些行业来说,客户不能接受通过远程登录服务器查看日志。因此,需要......
  • 【三方件】日志
    slf4j中的MDC工具类使用MDC: MappedDiagnosticContext,可以粗略的理解成是一个线程安全的存放诊断日志的容器。内部通过ThreadLocal实现了不同线程的隔离。参......
  • (16)go-micro微服务jaeger链路追踪
    目录一jaeger链路追踪介绍什么是链路追踪:链路追踪主要功能:二jaeger链路追踪作用三jaeger链路追踪主要特性四jaeger链路追踪原理图1.链路调用原理2.一次调用链分析3.链......
  • 【学习日志】线程池的4中拒绝策略
    AbortPolicy:丢弃任务并抛出RejectedExecutionException异常,线程池默认拒绝策略DiscardPolicy:丢弃任务,但不抛出异常DiscardOldestPolicy:丢弃队列最前面的任务后重新提交......
  • SpringCloud Sleuth链路追踪
    1、概要一般的,一个分布式服务跟踪系统,主要有三部分:数据收集数据存储数据展示然而这三个部分其实不都是由SpringCloudSleuth(下面我简称为Sleuth)完成的,Sleuth负责数......
  • dubbo实战篇:dubbo超时设置
    dubbo超时设置方式dubbo服务引用可以细化到接口级别。 在springboot项目中,dubbo消费者在设置dubbo超时时间时,可以在application.yml里设置属性dubbo.consumer.timeout......
  • SpringBoot日志框架分析
    本文简介第一部分,介绍spring-jcl适配各种日志框架的方式第二部分,介绍slf4j适配各种日志框架的方式第三部分,介绍下logback框架的使用及原理 一、spring-jcl分析说......
  • Nginx日志按天自动切割的shell脚本
    简介默认情况Nginx会把所有访问日志生成到一个指定的访问日志文件access.log里,但这样一来,时间长了就会导致日志内容很多,不利于分析日志和处理,因此,有必要对Nginx按天或按......
  • Istio可观测性(链路)
    可观测性的英文是Observability,这是伴随着云原生技术发展产生的一个新兴词汇,在传统的IT中,并没有这种说法。简单来说,可观测性是通过系统输出信息到外部,以检测系统内部的......