日志快速定位-traceId

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
应用实时监控服务ARMS - 应用监控,每月50GB免费额度
简介: 最近对接的时候有个细节让我比较关注,他们在解决问题的时候会问你请求的traceId是什么,然后他们就能通过日志快速定位问题。然后我就想,我们能不能搞一个玩一下。我们来想一下这个东西怎么实现。
  1. 1.我们要给每个请求分配一个单独的id
  2. 2.我们需要把这个id放到我们的日志中
  3. 3.我们还需要把这个id放到response中,可以被调用方感知到。

第一个方案比较简单,我们可以通过filter拦截所有请求,然后给每个请求分配一个traceId,然后把这个id放到response的header里,同时我们将traceId放到MCD中,然后log4j里读取输出就可以了


先写个Filter拦截请求

packagecom.example.demo2.filter;
importcn.hutool.core.util.IdUtil;
importorg.slf4j.MDC;
importorg.springframework.stereotype.Component;
importorg.springframework.web.filter.OncePerRequestFilter;
importjavax.servlet.*;
importjavax.servlet.annotation.WebFilter;
importjavax.servlet.http.HttpServletRequest;
importjavax.servlet.http.HttpServletResponse;
importjava.io.IOException;
/*** home.php?mod=space&uid=686208 zhangjiapeng* home.php?mod=space&uid=1248337 V1.0* @Title: TraceIdFilter* @Description: 每个请求分配一个traceId* home.php?mod=space&uid=686237 2022/1/13 10:22*/@WebFilter@ComponentpublicclassTraceIdFilterextendsOncePerRequestFilter {
privatestaticfinalStringTRACE_ID="traceId";
@Overridepublicvoiddestroy() {
    }
@OverrideprotectedvoiddoFilterInternal(HttpServletRequestrequest, HttpServletResponseresponse, FilterChainfilterChain) throwsServletException, IOException {
StringtraceId=IdUtil.fastSimpleUUID();
response.addHeader(TRACE_ID,traceId);
MDC.put(TRACE_ID,traceId);
filterChain.doFilter(request,response);
    }
}

在logback中使用**%X{traceId}**读取MDC中的内容

<appendername="CONSOLE"class="ch.qos.logback.core.ConsoleAppender"><encoderclass="ch.qos.logback.core.encoder.LayoutWrappingEncoder"><layoutclass="ch.qos.logback.classic.PatternLayout"><Pattern>%date{yyyy-MM-ddHH:mm:ss.SSS} %level [%X{traceId} ] [%thread][%file:%line] -%msg%n</Pattern></layout></encoder></appender>

效果如下:

2023-08-01 09:12:11.926 INFO [845ad00ad3014a2a9c70db003494c81f ] [http-nio-9090-exec-1][Demo2Application.java:29] - hello world


方案2:

因为我们接入了APM,APM中也有对应的traceId,所以我们能不能用APM的traceId呢。

首先引入APM工具包

<!--https://mvnrepository.com/artifact/org.apache.skywalking/apm-toolkit-trace --><dependency><groupId>org.apache.skywalking</groupId><artifactId>apm-toolkit-trace</artifactId><version>8.8.0</version></dependency>

改造一下TraceIdFilter

packagecom.example.demo2.filter;
importorg.apache.skywalking.apm.toolkit.trace.TraceContext;
importorg.slf4j.MDC;
importorg.springframework.stereotype.Component;
importorg.springframework.web.filter.OncePerRequestFilter;
importjavax.servlet.FilterChain;
importjavax.servlet.ServletException;
importjavax.servlet.annotation.WebFilter;
importjavax.servlet.http.HttpServletRequest;
importjavax.servlet.http.HttpServletResponse;
importjava.io.IOException;
/*** @author zhangjiapeng* @version V1.0* @Title: TraceIdFilter* @Description:* @date 2022/1/13 10:22*/@WebFilter@ComponentpublicclassTraceIdFilterextendsOncePerRequestFilter {
privatestaticfinalStringTRACE_ID="traceId";
@Overridepublicvoiddestroy() {
    }
@OverrideprotectedvoiddoFilterInternal(HttpServletRequestrequest, HttpServletResponseresponse, FilterChainfilterChain) throwsServletException, IOException {
StringtraceId=TraceContext.traceId();
response.addHeader(TRACE_ID,traceId);
MDC.put(TRACE_ID,traceId);
filterChain.doFilter(request,response);
    }
}

效果如下:

2023-08-01 10:32:21.776 INFO [e9a1abc4800345c6af4ee926be230f15.43.16420444870010001 ] [http-nio-9090-exec-2][Demo2Application.java:29] - hello world

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
5月前
|
Linux
linux定位日志文件
在Linux中查找名为&quot;log.txt&quot;的日志文件,可使用`find`命令从根目录开始搜索:`find / -name log.txt 2&gt;/dev/null`。此命令会忽略错误信息,确保只显示找到的文件路径。
42 1
|
12月前
|
Linux Perl
Linux 系统快速分析日志定位故障原因的 10 个方法
在 Linux 系统中,日志是一种非常重要的资源。系统管理员可以通过日志记录的内容来检测系统的运行状况,分析问题,做出相应的调整和优化。由于日志文件数量庞大,内容复杂,因此需要使用一些工具和技术帮助管理员进行快速分析和查找。 本文将介绍 Linux 系统中快速分析日志、定位故障的 10 个方法。
2243 1
|
21天前
|
Java
日志框架log4j打印异常堆栈信息携带traceId,方便接口异常排查
日常项目运行日志,异常栈打印是不带traceId,导致排查问题查找异常栈很麻烦。
|
SQL 缓存 监控
MySQL慢查询:慢SQL定位、日志分析与优化方案,真心不错!
MySQL慢查询:慢SQL定位、日志分析与优化方案,真心不错!
MySQL慢查询:慢SQL定位、日志分析与优化方案,真心不错!
|
监控 算法 Unix
在Linux服务器上通过日志筛选技巧定位Spring Boot项目问题
在项目开发和维护的过程中,我们经常需要在 Linux 服务器上查询和分析日志文件。为了高效地处理大量的文本数据,我们可以借助一些强大的文本过滤工具,如 tail -f、more、zmore 和 grep。本文将介绍这些常用的 Linux 命令,帮助您在日志分析中更加得心应手。
216 0
|
Java Nacos
java查看日志定位错误
java查看日志定位错误
|
JavaScript 小程序 Java
Spring Boot 实现日志链路追踪,无需引入组件,让日志定位更方便!
Spring Boot 实现日志链路追踪,无需引入组件,让日志定位更方便!
|
CDN
CDN诊断工具与日志的作用——如何利用诊断工具进行问题分析(查看定位到的是否是cdn节点)
CDN诊断工具与日志的作用——如何利用诊断工具进行问题分析(查看定位到的是否是cdn节点)自制脑图
161 0
CDN诊断工具与日志的作用——如何利用诊断工具进行问题分析(查看定位到的是否是cdn节点)
|
消息中间件 JavaScript 小程序
Linux 服务器大量的 log 日志,如何正确看日志快速定位错误?你必须学会!
Linux 服务器大量的 log 日志,如何正确看日志快速定位错误?你必须学会!
|
SQL 关系型数据库 MySQL
MySQL慢查询日志:如何定位执行慢的sql语句
MySQL慢查询日志:如何定位执行慢的sql语句
421 0
MySQL慢查询日志:如何定位执行慢的sql语句
下一篇
无影云桌面