分布式日志追踪 子线程丢失traceId的解决方法

MDC数据在多线程中数据丢失问题 MDC的数据是与线程挂钩,那么在主线程中启用多线程是,要在子线程中获取主线程的MDC数据,就需要手动把主线程的MDC数据手动塞入到子线程的MDC中,否则子线程是获取不到主线程MDC数据的。注意到,如果要在子线程中使用主线程的MDC数据,就需要在doMultiProcess()方法中手动把MDC的数据手动塞入进去。下面ProcessExecutor类是一个多线程执行工具。 阅读详情

重新线程池

提交线程任务的方法改造为

@Override
public <T> Future<T> submit(Runnable task, T result) {
    return super.submit(ThreadMdcUtil.wrap(task, MDC.getCopyOfContextMap()), result);
}
public static <T> Callable<T> wrap(final Callable<T> callable, final Map<String, String> context) {
    return () -> {
        if (context == null) {
            MDC.clear();
        } else {
            MDC.setContextMap(context);
        }
        setTraceIdIfAbsent();
        try {
            return callable.call();
        } finally {
            MDC.clear();
        }
    };
}

 

这样线程池里面的线程运行当前任务的时候,会将父线程的context带过来;这样就实现了context共享的效果。traceId也就不会丢失

 

Spring Boot项目如何实现分布式日志链路追踪 但是在并发情况下,大量的系统用户即多线程并发访问后端服务导致同一个请求的日志记录不再是连续相邻的,此时多个请求的日志是一起串行输出到文件中,所以我们筛选出指定请求的全部相关日志还是比较麻烦的,同时当后端异步处理功能逻辑以及微服务的下游服务调用日志追踪也有着相同的问题。当前线程的子线程会继承其父线程中的 MDC 的内容。按照上面说的,每个请求使用一个唯一标识traceId来追踪一次请求的全部日志,这就要求我们的traceId必须保证唯一性,不然就会出现请求日志混乱问题,是绝对不允许的。 阅读详情

相关推荐

Spring Boot全局TraceId实现:MDC+拦截器构建全链路日志追踪

在分布式系统和微服务架构中,日志分散是排查线上问题的核心痛点。通过引入链路追踪(Trace)技术,可以为每个请求分配全局唯一标识(TraceId),实现请求全生命周期的行为串联。其技术原理主要基于线程上下文(如SLF4J的MDC)和拦截器机制,在请求入口生成并传递唯一ID,并借助日志框架自动输出。这一实践的核心技术价值在于将碎片化的日志按请求维度聚合,极大提升了问题定位效率和系统可观测性。在应用场景上,它不仅是微服务调用链追踪的基础,也是异步任务、消息队列等复杂场景下保障日志一致性的关键。本文以Spring

weixin_30940783的博客 622

MDC机制实现日志的链路追踪

问题描述 最近经常做线上问题的排查,而排查问题用得最多的方式是查看日志,但是在现有系统中,各种无关日志穿行其中,导致我没办法快速的找出用户在一次请求中所有的日志。 问题分析 我们没办法快速定位用户在一次请求中对应的所有日志,或者说是定位某个用户操作的所有日志,那是因为我们在输出的日志的时候没把请求的唯一标示或者说是用户身份标示输出到我们的日志中,导致我们没办法根据一个请求或者用户身份标示来做...

luoqinglong的专栏 2564

SpringBoot日志追踪实战:如何用MDC和SLF4J给单体应用加上traceId

本文详细介绍了在SpringBoot单体应用中,如何利用SLF4J的MDC机制和过滤器,轻量级地实现日志链路追踪,为每个请求自动生成并传递唯一的traceId。通过核心代码示例和日志配置,解决了异步线程、定时任务等场景的上下文传递问题,显著提升线上问题排查效率。

iii12的专栏 248

多线程情形下,日志链路traceId、spanId的传递

创建线程池异步调用服务的情形中,子线程在打印日志的过程中traceId将丢失 解决思路:重写线程池,对任务进行一次封装,在调度任务的之前将链路塞入MDC。几乎所有的情形下很少会new线程池(及其不推荐使用),自带的创建线程池的方案也不推荐使用,阿里巴巴开发手册推荐创建线程池的方案是使用ThreadPoolExecutor创建线程池,线程池创建大小,自定义名称,自定义拒绝策略等优点在此不多赘述 直接上代码: import com.csrcb.constants.MyConstant; impor.

gangye19970101的博客 9227

MDC+线程池实战:解决异步日志traceId丢失的3个常见坑点

本文深入剖析了在异步编程中使用MDC和线程池时导致traceId丢失的三个核心问题:线程池配置不当、上下文清理不及时以及复杂链路集成盲区。通过实战案例,重点介绍了如何使用TaskDecorator等方案实现MDC上下文的正确传递与清理,确保异步日志链路追踪的完整性与准确性,避免数据串扰。

xxx12的博客 386

CANoe从入门到精通“保姆级”教程(二)- 堪称全网“最全”系列

CANoe各功能区介绍;

车载控制器AutoSAR软件开发工程师 2万+

微服务架构系列主题:基于SpringBoot实现全链路调用日志跟踪

本文转自:架构师 目录 MDC 介绍 1、简介: 2、API说明: 3、优点: MDC 使用 1、添加拦截器 2、修改日志格式 MDC 存在的问题 解决 MDC 存在的问题 子线程日志打印丢失traceId 线程池封装类:ThreadPoolExecutorMdcWrapper.java 线程traceId封装工具类:ThreadMdcUtil.java HTTP调用丢失traceId 1、HttpClient: 2、OKHttp: 3、RestTemplate: 4、第

Larry的博客 712

使用【阿里云百炼】搭建自己的大模型

本文介绍阿里云百炼大模型平台,其为企业级服务平台,融合通义千问等模型,支持多模态能力,提供一站式工具降低开发门槛。重点讲解智能体应用及大模型搭建步骤,含进入创新应用界面、选模型配参数、输指令、导数据、加载知识库、获取API Key、加样例库、配置MCP,还提及模型调试与多平台发布,并附试用链接,助力企业与开发者快速搭建适配业务的AI模型。

Larry的博客 4738

日志监控MDC TreaceId原理详解与重写

日志监控最核心部分,重写MDC,可跨线程传递

fuliyingIT的博客 2544

Plant simulation、Flexsim、Automod、Emulate3D、VisuaComponent仿真软件对比

E3D在行业内以展示效果好,入门阶段易学易用人机界面友好,电控仿真连接方便不需要借助其他第三方软件,E3D平台开放度较高用户DIY程度强,数据分析功能针对要评定对象的KPI的可根据项目或者使用者需求进行评定。3.支持导入导出多种格式的文件,比如dwg、dxf、fbx、obj、3ds、step、stp、iges、skp、stl、wrl、 bmp 等等。3.软件自带模型组件库程序代码开放,用户可以引用、修改、拷贝,按照自己的逻辑修改模型,或者创建模型并保存到组件库与别人共享。3. 支持导出布局图片。

qq_43342303的博客 3580

Cadence学习之路(六)元器件封装绘制

使用Allegro PCB Designer绘制元器件封装

qq_46757048的博客 1万+

链路追踪的核心概念:TraceId 的生命周期

跨线程 TraceId 丢失的本质是 ThreadLocal 与线程池复用机制之间的冲突。解决思路分为两个方向:如果团队追求最小改动、快速见效,使用和手动传播是最直接的方式。适用于异步任务较少的场景。如果希望业务代码零侵入、系统性地解决问题,装饰线程池或启用 TTL 集成是更优选择。通过、Spring或 SkyWalking 的 TTL 配置,可以在框架层面一劳永逸地解决跨线程链路追踪问题。

✨ 欢迎来到【Seal ^_^ 的优快云博客】!✨ 1506

【保姆级教程】教你如何轻松获取MIMIC数据使用权限

文章非常详细地介绍了MIMIC数据库申请使用的全部步骤。

越努力 越幸运 6600

日志排查问题困难?分布式日志链路跟踪来帮你

作者:朱乐陶,软件架构师,具备多年Java开发及架构设计经验,擅长微服务领域 作者博客:https://blog.youkuaiyun.com/zlt2000 个人博客纯净版https://www.fangzhipeng.com/springcloud/2019/08/21/distributed-logs.html 背景 开发排查系统问题用得最多的手段就是查看系统日志,在分布式环境中一般使用EL...

方志朋的专栏 6102

推理引擎终极对决:TensorRT vs ONNX Runtime,YOLOv8速度差30%的核心原因与实操指南

若你使用NVIDIA GPU,且追求极致速度和低延迟,TensorRT是唯一选择,尤其是边缘设备和实时场景;若你需要跨硬件部署、快速验证原型,或预算有限(无需NVIDIA GPU),ONNX Runtime是性价比之王;对于YOLOv8这类检测模型,TensorRT的FP16/INT8量化是“免费的速度提升”,建议优先采用。最后提醒:推理引擎的优化是“细节决定成败”——同样的引擎,不同的预处理方式、显存配置、批大小,都会导致10%-20%的性能差异。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1026

AutoJs调用DeepSeek大模型接口实战教程 AutoJs接入DeepSeek、 DeepSeek API调用 、 手机脚本接入大模型

通过这篇文章,我们用 AutoJs 成功接入了 DeepSeek Chat API。使用发送请求在 Header 里正确携带 API Key从里拿到最终返回结果这样一来,你就可以在 AutoJs 里实现一个智能助手脚本,甚至做更复杂的 AI 自动化工具。

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 468

Spring Boot 中使用自定义注解,AOP 切面打印出入参日志及Dubbo链路追踪透传traceId

一、使用背景 开发排查系统问题用得最多的手段就是查看系统日志,在分布式环境中一般使用 ELK 来统一收集日志,但是在并发大时使用日志定位问题还是比较麻烦,由于大量的其他用户/其他线程的日志也一起输出穿行其中导致很难筛选出指定请求的全部相关日志,以及下游线程/服务对应的日志。 二、解决思路 每个请求都使用一个唯一标识来追踪全部的链路显示在日志中,并且不修改原有的 使用Logback的MDC机...

FlowerJun的博客 2231

《自然语言处理实战入门》文本分类 ---- 使用词向量与SVM 进行文本分类

文本分类用电脑对文本集(或其他实体或物件)按照一定的分类体系或标准进行自动分类标记。 它根据一个已经被标注的训练文档集合, 找到文档特征和文档类别之间的关系模型, 然后利用这种学习得到的关系模型对 新的文档进行类别判断 。文本分类从基于知识的方法逐渐转变为基于统计 和机器学习的方法。

shiter编写程序的艺术 2388

线上 TraceId 集体失踪,大促排查如何破局?

并发工具极大提升了并发代码编写的效率,也预先为潜在问题备好高效解法,是开发过程中的得力助手。但开发人员不能仅满足于表面应用,务必深入剖析其实现逻辑,明晰不同场景下的适用规则。若对并发工具一知半解、盲目套用,不仅难以发挥其最大效能,面对复杂问题时会陷入被动,更可能在生产环境中引发严重线上故障。所以 J.U.C 虽好,可不要贪杯哦!最后,我最近弄了一个Java技术交流群,讨论面试、后端等领域知识,如果你感兴趣,欢迎关注我公众号回复【1】,我拉你入群哈~(我的公众号:程序员徐述)

xujunson的博客 1204

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

线程池中丢失traceId?用TransmittableThreadLocal+MDC搞定日志链路追踪(附logback/log4j2配置)

本文深入探讨了线程池环境下如何通过TransmittableThreadLocal与MDC整合实现全链路日志追踪,解决traceId丢失问题。详细介绍了TTL的核心机制、与Logback/Log4j2的集成方案,并提供了实战中的最佳实践与性能优化技巧,帮助开发者构建稳定的日志链路追踪体系。

z5a6b的博客 558

微服务分布式架构中,如何实现日志链路跟踪?

MDC(Mapped Diagnostic Context,映射调试上下文)是 log4j 和 logback 提供的一种方便在多线程条件下记录日志的功能。MDC 可以看成是一个与当前线程绑定的Map,可以往其中添加键值对。MDC 中包含的内容可以被同一线程中执行的代码所访问。当前线程的子线程会继承其父线程中的 MDC 的内容。当需要记录日志时,只需要从 MDC 中获取所需的信息即可。MDC 的内容则由程序在适当的时候保存进去。对于一个 Web 应用来说,通常是在请求被处理的最开始保存这些数据。!!

2023年最新地推相关信息 825
上一篇: Young GC越来越耗时
下一篇: ConcurrentHashMap 一些锁事
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值