线上报错客户能复现我们却查不到:MDC 注入 traceId 与日志聚合的排查记录

简介: 客户投诉线上报错,我们自己走三遍却一切正常,日志按时间捞几百条对不上。记录用 MDC 在请求入口注入 traceId、异步线程池和 MQ 消息头透传 traceId、ELK 按 traceId 聚合整条链路的完整过程,以及 ThreadLocal 清理、线程复用串号等踩坑。

上周有个客户连续两天打电话投诉:"我点开课程详情页就报错,你们自己试试。"我们把客户的操作路径走了三遍,一切正常,日志里也搜不到任何异常。客户报了个大概时间——下午三点十二分——我们在 ELK 里按那个时间拉了几百条日志,根本分不清哪条是这个用户的,像大海捞针。

最后定位到的问题其实很简单:某一门课的视频地址配置错了,但因为日志里没有一条贯穿请求的标识,我们死活对不上。前后花了一天半把 traceId 这套东西补上,记录下来。

一、问题本质:日志是散的,串不起来

现在的系统都是多实例 + 异步线程 + 消息队列。一个用户请求进来:

  1. 网关打一条访问日志。
  2. 业务服务打一条处理日志。
  3. 发了个 MQ 消息,消费者在另一台机器打一条日志。
  4. 异常发生在某个异步线程里。

这四条日志散在不同机器、不同日志文件里,时间还不完全对齐。客户说"三点十二分",你只能按时间范围捞,根本不知道哪几条属于同一个请求。

二、解法:MDC 注入 traceId,一条请求一路带下去

核心思路:请求进来时生成一个全局唯一的 traceId,放在日志框架的 MDC(Mapped Diagnostic Context)里,这个请求经过的所有日志自动带上它:

// 网关/拦截器里生成 traceId
String traceId = UUID.randomUUID().toString().replace("-", "");
MDC.put("traceId", traceId);

// 请求结束后清理
try {
    // 整个业务处理
} finally {
    MDC.clear();
}

日志格式里加上 %X{traceId}:

// logback pattern
%d{yyyy-MM-dd HH:mm:ss} [%thread] %X{traceId} %-5level %logger - %msg%n

这样每一条日志都长这样:

2026-10-12 15:12:03.211 [http-nio-8080-exec-3] a1b2c3d4... INFO  进入课程详情
2026-10-12 15:12:03.215 [http-nio-8080-exec-3] a1b2c3d4... ERROR 视频地址为空

客户只要能提供任意一条报错截图上的时间或订单号,我们就能反查 traceId,把这一次请求在所有服务、所有异步线程里的日志全捞出来。

三、两个必踩的坑:异步线程和 MQ 会丢 MDC

MDC 本质是 ThreadLocal,一旦切线程就没了。

坑 1:异步线程池。业务里用 @Async 或自己开线程池处理后续逻辑,子线程里 MDC 是空的,traceId 断了。要给线程池包一层任务装饰器,提交任务时把父线程的 MDC 复制过去:

// 包装 Runnable,执行前把父线程 MDC 放进子线程
public class MdcAwareRunnable implements Runnable {
    private final Map<String, String> context = MDC.getCopyOfContextMap();
    private final Runnable delegate;
    public void run() {
        if (context != null) MDC.setContextMap(context);
        try { delegate.run(); } finally { MDC.clear(); }
    }
}

坑 2:MQ 消息。发消息时把 traceId 塞进消息头,消费者收到后从消息头取出来放回 MDC,跨服务的链路就接上了。

四、ELK 里怎么按 traceId 查

日志统一收集到 ELK 后,查询很直接:

  1. 先按用户报错时间 + 用户ID 粗筛。
  2. 在结果里找到那条 ERROR 日志,复制它的 traceId。
  3. 用 traceId:a1b2c3d4... 精确搜索,这一次请求在所有机器、所有服务的日志就全出来了。

这次那个客户的问题,就是补上 traceId 后,从一条"视频地址为空"的 ERROR 反查整条链路,三分钟定位到是课程配置里视频 URL 字段存成了空字符串。

五、踩坑清单(5 条实际踩过的)

  1. 日志格式不加 %X{traceId},MDC 里放了也白放,打印不出来。
  2. 异步线程池一定要包装 MDC 传递,否则 traceId 一到异步就断。
  3. MQ 跨服务要把 traceId 放消息头,别指望 ThreadLocal 跨进程。
  4. 请求结束必须 MDC.clear(),否则线程复用会串到下一个请求。
  5. traceId 要返回给前端(放响应头或报错弹窗里),客户报错截图直接带 traceId,省得反查。
场景 traceId 传递方式
同服务同步调用 MDC 自动带
异步线程池 包装 Runnable 复制 MDC
HTTP 跨服务调用 放请求头,下游拦截器取出
MQ 消息 放消息头,消费者取出

这次线上日志链路补全是在乔拓云的教育系统后台上做的,我主要负责加网关 traceId 生成、包装异步线程池和 MQ 消息头透传那套逻辑,补完后同类"客户能复现我们查不到"的问题,平均定位时间从半天缩到十分钟。

复盘

  • 线上问题查不到,多半不是没日志,而是日志散在多实例多线程里串不起来。
  • MDC 注入 traceId 是成本最低收益最大的可观测改造,但要处理好异步线程和 MQ 两个断点。
  • traceId 最好回传前端,客户报错截图自带链路标识。

以上是个人实践记录,各平台具体功能以官方实时信息为准。

你们做链路追踪是用 MDC + ELK 自己拼,还是直接上 SkyWalking / Jaeger 这类 APM?

相关文章
|
21天前
|
人工智能 JSON API
全网刷屏的 Jev 模型正式开放!一手实战测评 + 保姆级教程
全网爆火的 Jev 模型是什么?有什么用?怎么使用?怎么接入 AI 编程工具?效果真的好么?傻子可懂的 Jev 保姆级实战教程 + 项目实战测评来啦
9099 29
|
20天前
|
人工智能 并行计算 PyTorch
秋叶 ComfyUI 2026 整合包 v3.2 完整部署教程:Python 3.13 + Torch 2.13 全栈升级
秋叶aaaki ComfyUI 2026年8月整合包v3.2正式发布!全面升级Python 3.13.11、PyTorch 2.13.0+cu130及ComfyUI v0.30.2,原生支持MiniMax H3、Wan 2.2、Qwen-Image-2.1等2026主流音视频/图像模型,解压即用,无需环境配置。
4236 16
|
20天前
|
人工智能 测试技术 API
最近全网爆火的 Jev 到底是什么?适合干什么、怎么用,一篇讲透!
Jev是TypeSafe AI推出的“系统一模型”,不生成文本,专做毫秒级结构化决策:Choice(多选)、Score(打分)、Noul(是非概率)。响应快193倍、成本低444倍,适合工单路由、内容审核、测试定级等高频判断场景。
2346 4
最近全网爆火的 Jev 到底是什么?适合干什么、怎么用,一篇讲透!
|
7天前
|
存储 人工智能 并行计算
大模型本地部署终端选型方法论:以 Qwen3.8-27B 为例的四档分层完整流程
本文提出一套大模型本地部署终端选型方法论:定约束、定档位、定框架、定参数四步决策法,配合入门、主力、质量、无损四档分层模型。以 Qwen3.8-27B 实测数据为例,逐环节解读显存、带宽、存储、散热、系统、预算等要素,给出面向不同预算的优选方案、决策自查清单与市场观察框架。文末前瞻 AI 笔记本的 CPU+GPU 与统一内存两条路线,论证四步决策法在新品类上的延续性。
|
6天前
|
人工智能 JSON 自然语言处理
2026 年 Jev 决策模型深度拆解:原理解读、实战测评与保姆级落地教程
有一款特殊AI模型在开发者圈子刷屏,它摒弃传统大模型擅长的对话聊天能力,专注做高速结构化决策,它就是TypeSafe AI推出的Jev模型。该模型由ChatGPT共同发明人Diogo Almeida主导研发,定位为**System One Model(系统一模型)**,对标人类大脑快速直觉判断的思维模式,在响应延迟、调用成本、结构化输出稳定性上相比传统生成式大模型有着巨大差异。本文会完整拆解Jev底层原理、三大核心原语能力、适用业务场景,同时提供可直接运行的curl、Python代码示例,并且结合多组实测数据,客观分析模型优势与能力边界,帮助普通开发者和AI应用从业者快速上手落地。
509 1
|
14天前
|
人工智能 Linux 开发者
【2026国内使用】Codex安装过程一篇讲透(Win/Mac/Linux全支持)
Codex是OpenAI推出的AI编程智能体,可读取本地项目、理解需求并自动修改代码。支持桌面GUI、命令行(CLI)及VS Code/Cursor插件三种形态,覆盖可视化操作、终端高效开发与编辑器无缝集成场景,助开发者用自然语言驱动编码全流程。(239字)
1119 2
【2026国内使用】Codex安装过程一篇讲透(Win/Mac/Linux全支持)
|
9天前
|
人工智能 Linux Windows
千问办公(QwenWork)官网入口:其实有2个,一个是网页端千问办公,一个是介绍指南页面
千问办公(QwenWork)是阿里云推出的AI智能办公平台,支持网页端直接使用及Windows/Mac/Linux客户端下载。提供PPT生成、财报分析、网页搭建等AI功能,个人版免费,企业版198元/席/月。详情见官网qwenwork.cn或阿里云产品页。
1075 0
千问办公(QwenWork)官网入口:其实有2个,一个是网页端千问办公,一个是介绍指南页面