吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1826|回复: 14
收起左侧

[Java 原创] 日志快速定位-traceId

[复制链接]
wuai000win 发表于 2023-7-25 09:52

日志快速定位-traceId

最近跟微信对接的时候有个细节让我比较关注,他们在解决问题的时候会问你请求的traceId是什么,然后他们就能通过日志快速定位问题。然后我就想,我们能不能搞一个玩一下。
我们来想一下这个东西怎么实现。

  1. 我们要给每个请求分配一个单独的id
  2. 我们需要把这个id放到我们的日志中
  3. 我们还需要把这个id放到response中,可以被调用方感知到。

实现方案1

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

先写个Filter拦截请求

package com.example.demo2.filter;

import cn.hutool.core.util.IdUtil;
import org.slf4j.MDC;
import org.springframework.stereotype.Component;
import org.springframework.web.filter.OncePerRequestFilter;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.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
@Component
public class TraceIdFilter extends  OncePerRequestFilter {

    private static final String TRACE_ID = "traceId";

    @Override
    public void destroy() {
    }

    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
        String traceId = IdUtil.fastSimpleUUID();
        response.addHeader(TRACE_ID,traceId);
        MDC.put(TRACE_ID,traceId);
        filterChain.doFilter(request,response);
    }
}

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

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

效果如下:

2022-01-13 11:12:11.926 INFO [845ad00ad3014a2a9c70db003494c81f ] [http-nio-9090-exec-1][Demo2Application.java:29] - hello world

response

Content-Length: 11
Content-Type: text/html;charset=UTF-8
Date: Thu, 13 Jan 2022 03:12:11 GMT
traceId: 845ad00ad3014a2a9c70db003494c81f

实现方案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

package com.example.demo2.filter;

import org.apache.skywalking.apm.toolkit.trace.TraceContext;
import org.slf4j.MDC;
import org.springframework.stereotype.Component;
import org.springframework.web.filter.OncePerRequestFilter;

import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * @author zhangjiapeng
 * @version V1.0
 * @Title: TraceIdFilter
 * @Description:
 * @date 2022/1/13 10:22
 */
@WebFilter
@Component
public class TraceIdFilter extends  OncePerRequestFilter {

    private static final String TRACE_ID = "traceId";

    @Override
    public void destroy() {
    }

    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
        String traceId = TraceContext.traceId();
        response.addHeader(TRACE_ID,traceId);
        MDC.put(TRACE_ID,traceId);
        filterChain.doFilter(request,response);
    }
}

效果如下:

2022-01-13 11:28:07.226 INFO [e9a1abc4800345c6af4ee926be230f15.43.16420444870010001 ] [http-nio-9090-exec-2][Demo2Application.java:29] - hello world

response

Content-Length: 11
Content-Type: text/html;charset=UTF-8
Date: Thu, 13 Jan 2022 03:28:07 GMT
traceId: e9a1abc4800345c6af4ee926be230f15.43.16420444870010001

看一下APM能不能搜到

1642044619379

免费评分

参与人数 3吾爱币 +9 热心值 +2 收起 理由
Harmon666 + 1 谢谢@Thanks!
帽子先生 + 1 + 1 学到了,我们也加一个
苏紫方璇 + 7 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

iteamo 发表于 2023-10-9 21:28
厉害,跟微信学习了,举一反三~
wlhy 发表于 2023-10-13 10:53
sunshinevim 发表于 2023-10-21 22:05
1124480274 发表于 2023-12-13 09:28
这个方法我们有在用,找问题确实方便了很多
znow520 发表于 2023-12-28 11:16
跟大佬学习下
夏橙M兮 发表于 2024-1-20 13:39
这个MDC起什么作用的?
alan3258 发表于 2024-2-6 14:13
感谢分享,用到项目中去了
eson998 发表于 2024-2-29 16:42
厉害了,学习学习
kariru 发表于 2024-3-3 17:34
学习学习
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:本版块禁止灌水或回复与主题无关内容,违者重罚!

快速回复 收藏帖子 返回列表 搜索

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-5-3 19:19

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表