分布式日志追踪 子线程丢失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

东方财富网API接口逆向分析:手把手教你破解那个带jQuery回调的股票数据接口

本文详细解析了东方财富网股票数据API接口的逆向工程实战技巧,重点介绍了JSONP接口的核心机制、参数解析及数据处理方法。通过Python代码示例演示了如何构造请求、处理分页数据及应对反爬策略,帮助开发者高效获取股票数据。文章还提供了完整的爬虫实现案例和常见问题排查指南。

weixin_30790841的博客 716

微服务架构系列主题:基于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

文献阅读笔记:量子微波测量技术综述

量子微波测量技术研究进展:量子微波测量技术利用里德堡原子与微波电场的相干相互作用,突破了传统测量方法的物理限制。该技术基于电磁诱导透明效应和里德堡原子能级跃迁原理,通过激光激发原子并监测光谱变化来测量微波电场强度。相比传统方法,量子微波测量具有超高灵敏度(理论极限可达nV/cm)、宽动态范围(超过100dB)、小型化等显著优势,且测量结果可直接溯源至普朗克常数。典型实验系统包括光源、原子气室和探测器,采用光谱法、干涉法等多种测量方法。近年来,该技术在基础研究和应用方面取得重要进展,展现出在通信、雷达、计量等

Grow into a more wonderful you 988

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

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

fuliyingIT的博客 2544

ShardingSphere分库分表教程,java后端开发面试题

???? 简介:Java领域优质创作者????、优快云哪吒公众号作者✌ 、Java架构师奋斗者???? ???? 扫描主页左侧二维码,加入群聊,一起学习、一起进步 ???? 欢迎点赞 ???? 收藏 ⭐留言 ???? 目录 一、分库分表 二、分库分表的方式 1、垂直分表 2、垂直分库 3、水平分表 4、水平分库 三、分库分表带来的问题 1、学习成本问题 2、事务问题 3、跨节点join问题 4、跨节点的count、order by、group by以及聚合函数问题 5、数据迁移、容量规划、扩

m0_64205716的博客 3015

测站坐标系统 -- 东北天(ENU)坐标系、站心坐标系

测站坐标系统以观测站(或地面上某一个观测点为中心建立坐标系统,将这类坐标系称为测站坐标系统。测站坐标系通常以用户所在的位置点P为坐标原点三个坐标轴分别是相互垂直的东向北向和天向,因而测站坐标系又称为东北天(ENU)坐标系。由于测站坐标系以站心为坐标原点,因此也称为站心坐标系。如图所示,测站坐标系的天向与大地坐标系(LLA经纬度坐标系)在此点的高程方向一致。测站坐标系固定在地球上,本质上是一种地固坐标系。(1)以站心为坐标原点。(2)Z轴与站心点的椭球法线重合,向上为正。

qq_43381998的博客 1万+

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

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

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

【AI Agent系列】【MetaGPT】9. 一句话订阅专属信息 - 订阅智能体进阶,实现一个更通用的订阅智能体(2)

订阅智能体进阶(2)。不用爬虫,直接提取网页信息。从RunSubscription分离出AddSubscriptionTask的action,并且让SubscriptionRunner单独运行。

同学小张的博客 1587

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

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

方志朋的专栏 6102

从0到全栈:C#/.NET/.NET Core终极学习路线——2025年开发者必修的12个阶段与30个实战项目

【代码】从0到全栈:C#/.NET/.NET Core终极学习路线——2024年开发者必修的12个阶段与30个实战项目。

墨夶的博客 2042

华为OD机试双机位C卷-水库溃坝填补(Py/Java/C/C++/Js/Go)

华为OD机试(机考)双机位C卷 【水库溃坝填补】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。水库溃坝填补。

qq_45776114的博客 2109

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

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

FlowerJun的博客 2231

educoder中Hive综合应用案例 — 用户搜索日志分析

Hive综合应用案例 — 用户搜索日志分析

weixin_46026136的博客 4778

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

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

xujunson的博客 1204

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

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

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

z5a6b的博客 558

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

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

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

2023年最新地推相关信息 825

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

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

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值