Java应用日志如何与Jaeger的trace关联,万字解析

  • 再来看一段日志的代码,先调用MDC.put方法将一个键值对写入当前线程的诊断上下文map(diagnostic context map),键名和上面的模板中配置的**%X{user-id}**一模一样:

@GetMapping("/test")

public void test() {

MDC.put(“user-id”, “user-” + System.currentTimeMillis());

log.info(“this is test request”);

}

  • 现在把代码运行起来,打印日志看看,如下所示,之前模板中配置的**%X{user-id}**已被替换成了user-1632122267618,就是代码中MDC.put设置的值:

15:17:47 [http-nio-18081-exec-6] INFO c.b.j.c.c.HelloConsumerController [user-id=user-1632122267618] this is test request

  • 以上就是MDC的基本功能:对日志模板中的变量进行填充,填充的内容可以用MDC.put方法随意设置;

  • 此刻聪明的您应该能猜到jaeger官方的方案是如何实现的了,没错,就是借助MDC将trace信息填充到日志模板中,这样每行日志都有了trace信息,咱们在jaeger web页面中感兴趣的任何一次trace,都能找到对应的日志了

关于Jaeger的官方方案

  • Jaeger的官方方案如下图所示,SDK已经把traceId、spanId、sampled写入当前线程的诊断上下文map(diagnostic context map),只要日志模板中配置上述三个变量,就会在所有业务日志中输出它们具体的值:

![在这里插入图片描述](https://img-blog.csdni

【一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义】

浏览器打开:qq.cn.hn/FTf 免费领取

mg.cn/08722324a4ad4c71a65d0874c235ac52.png?,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA56iL5bqP5ZGY5qyj5a64,size_20,color_FFFFFF,t_70,g_se,x_16)

  • 看起来似乎非常简单,那就动手编码试试吧

编码实战

  • jaeger与MDC的关联只是个小功能,没必要大张旗鼓的新建项目,基于《Jaeger开发入门(java版)》的代码继续开发即可,也就是说修改两个子工程jaeger-service-consumer和jaeger-service-provider的源码,让它们的业务日志打印出Jaeger的trace信息

  • 首先从jaeger-service-provider工程开始,增加一个标准的logback日志配置文件logback.xml,如下所示,日志模板中已添加了traceId、spanId、sampled变量:

<?xml version="1.0" encoding="UTF-8"?>

logback

INFO

%d{HH:mm:ss} [%thread] %-5level %logger{10} [traceId=%X{traceId} spanId=%X{spanId} sampled=%X{sampled}] %msg%n

utf-8

  • 再去检查配置类,确认JaegerTracer实例化时用了MDCScopeManager参数,如下所示,咱们在上一章已经这么做了,可以维持不变:

package com.bolingcavalry.jaeger.provider.config;

import io.jaegertracing.internal.MDCScopeManager;

import io.opentracing.contrib.java.spring.jaeger.starter.TracerBuilderCustomizer;

import org.springframework.context.annotation.Bean;

import org.springframework.context.annotation.Configuration;

@Configuration

public class JaegerConfig {

@Bean

public TracerBuilderCustomizer mdcBuilderCustomizer() {

// 1.8新特性,函数式接口

return builder -> builder.withScopeManager(new MDCScopeManager.Builder().build());

}

}

  • 接下来是在业务代码中随意加几行打印日志的代码,如下图红框所示:

Java应用日志如何与Jaeger的trace关联,万字解析

  • 接下来继续修改jaeger-service-consumer子工程,具体步骤与刚才改造jaeger-service-provider时一模一样,就不多占用篇幅赘述了,记得在业务代码中随意加几行日志,如下图红框:

Java应用日志如何与Jaeger的trace关联,万字解析

上一篇:python类型错误:can only concatenate list (not "str") to list


下一篇:【Spring技术原理】Aspectj和LoadTimeWeaving的动态代理技术实现指南