SpringBoot使用TraceId日志链路追踪-1

traceId跟踪请求全流程日志 一个系统被拆分成N多个模块,这些模块负责不同的功能,组合成一套系统,最终可以提供丰富的功能。在这种分布式架构中,一次请求往往需要涉及到多个服务,如下图:服务之间的调用错综复杂,对于维护的成本成倍增加,势必存在以下几个问题:服务之间的依赖与被依赖的关系如何能够清晰的看到?出现异常时如何能够快速定位到异常服务?出现性能瓶颈时如何能够迅速定位哪个服务影响的?为了能够在分布式架构中快速定位问题,分布式链路追踪应运而生。 阅读详情

项目场景:

有时候一个业务调用链场景,很长,调了各种各样的方法,看日志的时候,各个接口的日志穿插,确实让人头大。为了解决这个痛点,就使用了TraceId,根据TraceId关键字进入服务器查询日志中是否有这个TraceId,这样就把同一次的业务调用链上的日志串起来了,当前适合配置微服务中的简单分布式日志追踪,特别复杂的还是推荐Skywalker。

springboot

一个简单的springboot无需其他依赖

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-logging</artifactId>
    </dependency>
    <!--lombok配置-->
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>1.16.10</version>
    </dependency>
</dependencies>

整合logback,打印日志,logback-spring.xml (简单配置下)

<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false">
    <!--日志存储路径-->
    <property name="log" value="D:/test/log" />
    <!-- 控制台输出 -->
    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <!--输出格式化-->
            <pattern>[traceId:%X{traceId}]  %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
        </encoder>
    </appender>
    <!-- 按天生成日志文件 -->
    <appender name="file" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!--日志文件名-->
            <FileNamePattern>${log}/%d{yyyy-MM-dd}.log</FileNamePattern>
            <!--保留天数-->
            <MaxHistory>30</MaxHistory>
        </rollingPolicy>
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>[traceId:%X{traceId}]  %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
        </encoder>
        <!--日志文件最大的大小-->
        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
            <MaxFileSize>10MB</MaxFileSize>
        </triggeringPolicy>
    </appender>
 
    <!-- 日志输出级别 -->
    <root level="INFO">
        <appender-ref ref="console" />
        <appender-ref ref="file" />
    </root>
</configuration>

application.yml

server:
  port: 8826
logging:
  config: classpath:logback-spring.xml

自定义日志拦截器 LogInterceptor.java

用途:每一次链路,线程维度,添加最终的链路ID traceId。

MDC(Mapped Diagnostic Context)诊断上下文映射,是@Slf4j提供的一个支持动态打印日志信息的工具。

import org.slf4j.MDC;
import org.springframework.lang.Nullable;
import org.springframework.util.StringUtils;
import org.springframework.web.servlet.HandlerInterceptor;
 
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.UUID;
 
/**
 * 日志拦截器
 */
public class LogInterceptor implements HandlerInterceptor {
 
    private static final String traceId = "traceId";
 
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
        String tid = UUID.randomUUID().toString().replace("-", "");
        //可以考虑让客户端传入链路ID,但需保证一定的复杂度唯一性;如果没使用默认UUID自动生成,这里也支持feign方式调用其他服务接口前提是要在请求头中把traceId带过去
        if (!StringUtils.isEmpty(request.getHeader("traceId"))){
            tid=request.getHeader("traceId");
        }
        MDC.put(traceId, tid);
        return true;
    }
 
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
        // 请求处理完成后,清除MDC中的traceId,以免造成内存泄漏
        MDC.remove(traceId);
    }
 
}

WebConfigurerAdapter.java 添加拦截器

import javax.annotation.Resource;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;
 
 
@Configuration
public class WebConfigurerAdapter extends WebMvcConfigurationSupport {
    @Resource
	private LogInterceptor logInterceptor;
 
	@Override
	public void addInterceptors(InterceptorRegistry registry) {
		registry.addInterceptor(logInterceptor);
		//可以具体制定哪些需要拦截,哪些不拦截,其实也可以使用自定义注解更灵活完成
//                .addPathPatterns("/**")
//                .excludePathPatterns("/testxx.html");
	}
}

接口测试

import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
 
import javax.annotation.Resource;
 
@RestController
@Api(tags = "测试接口")
@RequestMapping("/test")
@Slf4j
public class TestController {
 
 
	@RequestMapping(value = "/log", method = RequestMethod.GET)
	@ApiOperation(value = "测试日志")
	public String sign() {
		log.info("这是一行info日志");
		log.error("这是一行error日志");
		return "success";
	}
}

因为我这里根据我自己的项目进行了改造,因此截图部分的日志和上面的配置不通,但是大体相差不大,可以看出这里已经把这个traceId打印出来了,即便是分布式定时任务,它执行时也会生成一个traceId带出来,这样分析日志时我们只用重点关注traceId对应的值的日志即可。如果后续把日志接入ES中那么可以直接筛选出该对应traceId的调用链路的全部日志

在这里插入图片描述

原文转载

https://blog.youkuaiyun.com/u011974797/article/details/143682368

如何为服务自定义链路追踪(traceID) 链路追踪是一种追踪,监控服务请求的技术概称。主要是为了帮助开发者了解一个请求在服务间的流转路径,执行时间,延迟以及问题追踪定位。特点:可视化请求流:展示一个请求的完整调用路径。性能分析:识别请求在哪个环节出现延迟,优化系统性能。问题排查:快速定位错误发生的位置,提高故障恢复效率。调用关系分析:帮助理解微服务之间的依赖关系。链路追踪的工作流程请求进入系统:用户发起 HTTP 请求,链路追踪系统生成一个Trace ID。请求传播Trace ID。 阅读详情

相关推荐

SpringBoot项目注入 traceId 来追踪整个请求的日志链路

SpringBoot项目注入 traceId 来追踪整个请求的日志链路,有了 traceId, 我们在排查问题的时候,可以迅速根据 traceId 查找到相关请求的日志,特别是在生产环境的时候,用户可能只提供一个错误截图,我们作为开发人员想要更详细的日志,这时候我们就可以直接根据用户提供的 traceId 来查找用户这次请求的整个日志,会方便很多。即使是在单体应用中,为请求添加一个唯一的traceId以追踪整个请求链路的日志也是完全可行的。关于更具体的日志输出配置,可以参考我的这篇文章《

z284747的博客 2663

链路追踪的traceid原理梳理

链路追踪的traceid原理梳理 欠

当我谈编程时我谈些什么 2万+

SpringBoot使用TraceId日志链路追踪

用途:每一次链路,线程维度,添加最终的链路ID traceId。MDC(Mapped Diagnostic Context)诊断上下文映射,是@Slf4j提供的一个支持动态打印日志信息的工具。/*** 日志拦截器*/@Override//可以考虑让客户端传入链路ID,但需保证一定的复杂度唯一性;如果没使用默认UUID自动生成if (!@Override// 请求处理完成后,清除MDC中的traceId,以免造成内存泄漏/*** 声明一个线程池。

m0_74825238的博客 1243

链路日志中追踪traceId

mdc就是基于Threadlocal进行的一个流程周转的标志物的传递,就是根据这种标志,可以追踪到日志的整体请求记录,便于进行定位到问题所在,而且对于用户的影响极小。

sun_fubao的博客 9972

微服务框架TraceId方案

MDC(Mapped Diagnostic Context,映射诊断上下文)是 log4j 和 logback 提供的一种方便在多线程条件下记录日志的机制。MDC 中包含的内容可以被同一线程中执行的代码所访问。当前线程的子线程会继承其父线程中的 MDC 的内容(只有子线程创建的时候初始化一次并不适用于线程池)。在项目中随着项目的业务越来越复杂,以及项目的微服务化等,导致平常的项目中出现如:同一次操作日志散乱等现象,对通过查询日志的方式排查问题造成极大困扰。因此迫切需要一种可以追溯当前链路操作日志的手段。

雨后是冰雹 4459

SpringBoot使用TraceId日志链路追踪:让你的应用日志更清晰可追踪!

大家好!今天我们来聊聊如何在 SpringBoot 应用中使用 TraceId 来进行日志链路追踪。你是否曾经在排查系统问题时,遇到过日志过多、难以找到根源的情况?尤其是在微服务架构中,一个请求可能会涉及多个服务,日志若不做追踪,会让问题排查变得非常麻烦。TraceId 正是为了解决这个问题而存在的!我相信很多开发者都有过这样的烦恼:在复杂的分布式系统中,一个请求会涉及到多个服务,日志堆积如山,排查问题时根本无从下手。这时,如果每个日志都能够标记上统一的 TraceId,问题追踪将变得高效多了。

喵手的博客 1306

springboot在feign和线程池中使用TraceId日志链路追踪(最终版)-2

异步请求丢失上文的问题,这些问题追根究底都是ThreadLocal惹得祸。由于ThreadLocal只能保存当前线程的信息,不能实现父子线程的继承。说到这,很多人想到了InheritableThreadLocal,确实InheritableThreadLocal能够实现父子线程间传递本地变量,但是你的程序如果采用线程池,则存在着线程复用的情况,这时就不一定能够实现父子线程间传递了,因为在线程在线程池中的存在不是每次使用都会进行创建,

牧竹子 1693

COLMAP性能优化实战:如何用GPU加速和并行计算让重建速度提升300%

本文详细介绍了如何通过GPU加速、并行计算和参数调优显著提升COLMAP的三维重建效率。从硬件资源分配到计算流程优化,再到大型数据集的分块处理策略,全面解析了将重建速度提升300%以上的实用技巧,特别适合处理无人机航拍和室内扫描等大规模三维重建项目。

weixin_29098391的博客 202

【日志链路】⭐️SpringBoot 整合 TraceId 日志链路追踪!

本地实测下 SpringBoot 整合 TraceId 日志链路追踪!

产品经理克星(狗头) 1819

PVT(Process Voltage Temperature)

芯片PVT

网始如芯个人博客 3万+

保姆级教程:用NILMTK和REDD数据集,5分钟跑通你的第一个负荷分解模型

本文提供了一份详细的NILMTK和REDD数据集负荷分解模型教程,适合零基础用户快速上手。从环境准备、数据获取到模型构建和评估,全程仅需5分钟即可完成。特别适合希望快速入门非侵入式负荷分解(NILM)的开发者,涵盖数据预处理、模型训练及结果可视化等关键步骤。

weixin_30493401的博客 441

SpringBoot 使用 TraceId 日志链路追踪!

用途:每一次链路,线程维度,添加最终的链路 ID traceId.MDC(Mapped Diagnostic Context) 诊断上下文映射,是@Slf4j提供的一个支持动态打印日志信息的工具。/*** 日志拦截器*/@Override//可以考虑让客户端传入链路ID,但需保证一定的复杂度唯一性;如果没使用默认UUID自动生成if (!returntrue;@Override// 请求处理完成后,清除MDC中的traceId,以免造成内存泄漏/**

1805

truetime2.0使用说明

truetime2.0使用说明1.1 truetime2.0工具箱的下载与安装1.2 truetime2.0工具箱的配置1.3 truetime2.0各模块的说明 注意,以下出现的地址本电脑MATLAB安装路径,请注意自己的MATLAB安装路径 1.1 truetime2.0工具箱的下载与安装 步骤1)没有工具箱的朋友可以 在可以在这个网站上免费申请下载http://www.control.lth.se/truetime/,里面有最新的版本。我用的是TrueTime 2.0 beta 1 步骤2)将

小六@sll 浊酒一杯 畅谈三千 清茶一壶 念游四海 4201

Dubbo日志链路追踪TraceId选型

一、目的 开发排查系统问题用得最多的手段就是查看系统日志,但是在分布式环境下使用日志定位问题还是比较麻烦,需要借助 全链路追踪ID 把上下文串联起来,本文主要分享基于 Spring Boot + Dubbo 框架下 日志链路追踪ID 的实现方案选型思路。   目前大多数分布式追踪系统的思想模型都来自 Google's Dapper 论文 全链路追踪的核心思想: 为每条请求都单独分配一个唯一的 traceId 用来标识一条请求链路,该 traceId 会贯穿整个请求处理过程的所有服务.

zlt2000的博客 1907

【Bug已解决】[Bug]: ValueError: No user query found in messages QWEN 3.5 27B VLLM 0.16.0 NIGHTLY 解决方案

用 vLLM 0.16.0 nightly 给发聊天请求时,服务端在处理消息时抛ValueError,请求失败。

博客 398

应用商店评论分析实战:Python逆向工程破解Google Play加密接口与NLP建模

在移动互联网时代,应用商店中的用户评论成为了开发者优化应用、提升用户体验的重要依据。然而,Google Play等应用商店对评论数据进行了加密处理,直接爬取难度较大。本文将介绍如何使用Python逆向工程破解Google Play的加密接口,实现对应用商店评论的实时采集,并结合NLP(自然语言处理)技术进行情感分析和主题建模,为开发者提供有价值的数据支持。

u014481728的博客 1346

SpringBoot项目中通过MDC和自定义Filter操作traceId实现日志链路追踪

1.背景简述 依赖原始的log4j2配置,很难从某服务庞杂的日志中,单独找寻出某次API调用的全部日志。 本文通过在日志中打印唯一的traceId来实现每次调用的追踪。 2.关键思路 2.1.MDC 日志追踪目标是每次请求级别的,也就是说同一个接口的每次请求,都应该有不同的traceId。 每次接口请求,都是一个单独的线程,所以自然我们很容易考虑到通过ThreadLocal实现上述需求。 考...

韩超的博客 (hanchao5272) 1万+

TIP 2024 | 跨类与跨域语义增强用于域泛化

域泛化方法旨在通过多样化的源域帮助开发一个在未知目标域上表现良好的通用模型。数据增强已被证明是增强计算机视觉中域泛化的有效方法。最近,基于语义级别的数据增强取得了显著成果。然而,这些方法主要集中在从类内和域内采样语义方向,限制了源域的多样性。为了解决这个问题,作者提出了一种新的方法,称为跨类与跨域语义增强(CDSA)。首先,作者引入了一种基于采样的方法CrossSmooth,从跨类中获取语义方向。然后,CrossVariance通过采样语义方向获取不同域的样式。

小白学视觉 210

Springboot starter开发之traceId请求日志链路追踪

一、请求链路追踪是什么? 能标识一次请求的完整流程,包括日志打印、响应标识等,以便于出现问题可以快速定位并解决问题。

隐风的博客 5508

Java炫酷烟花③(完整代码)

Java语言实现炫酷烟花动画的完整代码。 下载代码 下载链接:我是一只有趣的兔子,感谢你的喜欢。

AIGC 783

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

上一篇: 甲流和普通感冒如何区别
下一篇: springboot在feign和线程池中使用TraceId日志链路追踪(最终版)-2
牧竹子
博客等级 码龄17年 572粉丝 233原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值