写点什么

Java 应用日志如何与 Jaeger 的 trace 关联

  • 2022 年 4 月 18 日
  • 本文字数:1580 字

    阅读完需:约 5 分钟

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


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


<configuration scan="true" scanPeriod="60 seconds" debug="false">


<contextName>logback</contextName>


<appender name="console" class="ch.qos.logback.core.ConsoleAppender">


<filter class="ch.qos.logback.classic.filter.ThresholdFilter">


<level>INFO</level>


</filter>


<encoder>


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


<charset>utf-8</charset>


</encoder>


</appender>


<root level="info">


<appender-ref ref="console" />


</root>


</configuration>


  • 再去检查配置类,确认 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());


}


}


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



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



  • 开发完成,开始验证吧

[](()验证

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


  • 像[《Jaeger 开发入门(java 版)》](()那样操作,将 jaeger-service-consumer 和 jaeger-service-provider 编译构建制作成 docker 镜像

  • 用 docker-compose 将所有服务启动,然后通过浏览器访问 jaeger-service-consumer 的服务,多访问几次

  • 打开 jaeger 的 web 页面,可以看到多次请求的 trace,咱们随机选择一个,鼠标点击下图红框中的圆点:


![在这里插入图片描述](https://img-blog.csdnimg.cn/bd0c2004da4b436b9b2dbe1cd594fc4e.png?x-oss-process=image/watermark,type_ZHJ Java 开源项目【ali1024.coding.net/public/P7/Java/git】 vaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA56iL5bqP5ZGY5qyj5a64,size_20,color_FFFFFF,t_70,g_se,x_16)


  • 此时会跳转到该 trace 的详情页,注意页面的 url,如下图红框,里面的 2037fe105d73f4a5 就是 traceid:



  • 2037fe105d73f4a5 搜索 jaeger-service-provider 的日志,由于应用部署在 docker 中,咱们要用 docker log 和 grep 命令组合来过滤,如下所示,咱们代码写的日志都打印出来了,并且红框中就是 traceid 等关键信息



  • 再去查看 jaeger-service-consumer 的日志,如下图红框,本次请求相关的日志也可以通过 traceid 搜索到:



  • 至此,本篇实战就完成了,Jaeger 的 web 页面上的任何一个 trace,现在都能轻易找到与之对应的所有业务日志,这在定位问题时简直是如虎添翼的效果,如果您的系统用了 ELK 或者 EFK 来汇总所有分布式服务的日志,那就更高效了

最后

Java 架构进阶面试及知识点文档笔记


这份文档共 498 页,其中包括 Java 集合,并发编程,JVM,Dubbo,Redis,Spring 全家桶,MySQL,Kafka 等面试解析及知识点整理



Java 分布式高级面试问题解析文档


其中都是包括分布式的面试问题解析,内容有分布式消息队列,Redis 缓存,分库分表,微服务架构,分布式高可用,读写分离等等!



互联网 Java 程序员面试必备问题解析及文档学习笔记



Java 架构进阶视频解析合集

用户头像

还未添加个人签名 2022.04.13 加入

还未添加个人简介

评论

发布
暂无评论
Java应用日志如何与Jaeger的trace关联_Java_爱好编程进阶_InfoQ写作平台