Java 应用日志如何与 Jaeger 的 trace 关联
首先从 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,咱们随机选择一个,鼠标点击下图红框中的圆点:

此时会跳转到该 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 架构进阶视频解析合集
评论