最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Spring項目如何實現(xiàn)帶請求鏈路id的日志記錄

 更新時間:2024年12月19日 08:49:12   作者:名一  
我們在做項目的時候通常需要通過請求日志來排查定位線上問題,如果日志比較多而我們又需要查找整個請求的全部日志的時候會比較困難,下面我們就來看看如何用java aop實現(xiàn)請求id的日志記錄吧

我們在做java項目的時候通常需要通過請求日志來排查定位線上問題,在日志比較多而我們又需要查找整個請求的全部日志的時候會比較困難。所以,就需要在日志記錄的時候講同一個請求的關鍵日志用同一個唯一標識串聯(lián)起來。這樣查找的時候就會比較好查找。下面來用java aop實現(xiàn)請求id的日志記錄。(該支持子線程繼承主線程請求id)

一:首先我們需要一個日志請求鏈路id切面類

注意:如果不考慮多線程則(第二步和第三步可以不要)

package com.iMagine.iMagine_pro.aop;

import com.iMagine.iMagine_common.utils.UUIDUtil;
import com.iMagine.iMagine_pro.utils.TokenUtil;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.slf4j.MDC;
import org.springframework.stereotype.Component;


/**
 * @author 名一
 * @ClassName TraceIdAspect
 * @description: 日志請求鏈路id切面處理
 * @datetime 2024年 12月 16日 14:28
 * @version: 1.0
 */
@Slf4j
@Aspect
@Component
public class TraceIdAspect {
    
    /** 鏈路追蹤id */
    public final static String TRACE_ID = "TRACE_ID";
    /** 用戶 */
    public final static String USER = "USER";
    
    /**
     * 鏈路id切點定義
     */
    @Pointcut("execution(* com.iMagine.iMagine_pro.controller.*.*(..))")
    public void TraceIdCut() {

    }

    /**
     * 鏈路id添加
     */
    @Before("TraceIdCut()")
    public void cutProcessBefore() {
        MDC.put(TRACE_ID, UUIDUtil.getUUID());
        //以下代碼為記錄用戶信息,方便更直觀的識別日志操作人信息。若不需要可以將下面部分刪除
        String nickname = TokenUtil.getNicknameByToken();
        if (null == nickname){
            nickname = "游客訪問";
        }
        MDC.put(USER, nickname);
    }

    /**
     * 鏈路id清除
     */
    @After("TraceIdCut()")
    public void cutProcessAfter() {
        MDC.clear();
    }
}
package com.iMagine.iMagine_common.utils;

import java.util.UUID;

/**
 * @author 名一
 * @ClassName UUIDUtil
 * @description: UUID工具類
 * @datetime 2024年 04月 23日 11:49
 * @version: 1.0
 */
public class UUIDUtil {

    /**
     * 獲取UUID
     *
     * @return
     */
    public static String getUUID() {
        //生產(chǎn)uuid并去掉uuid的短橫線
        return UUID.randomUUID().toString().replace("-", "");
    }
}

二:創(chuàng)建一個處理多線程鏈路追蹤的工具類

package com.iMagine.iMagine_common.utils;

import com.iMagine.iMagine_common.constant.SysConstant;
import org.slf4j.MDC;

import java.util.Map;

/**
 * @author 名一
 * @ClassName ThreadMdcUtil
 * @description: 多線程鏈路追蹤工具類
 * @datetime 2024年 12月 16日 14:57
 * @version: 1.0
 */
public class ThreadMdcUtil {

    // 獲取唯一性標識
    public static String generateTraceId() {
        return UUIDUtil.getUUID();
    }

    public static void setTraceIdIfAbsent() {
        if (MDC.get(SysConstant.TRACE_ID) == null) {
            MDC.put(SysConstant.TRACE_ID, generateTraceId());
        }
    }

    /**
     * 用于父線程向線程池中提交任務時,將自身MDC中的數(shù)據(jù)復制給子線程
     *
     * @param runnable  要執(zhí)行的線程
     * @param context   父線程的mdc
     * @return          鏈路id傳遞后的任務
     */
    public static Runnable wrap(final Runnable runnable, final Map<String, String> context) {
        return () -> {
            if (context == null) {
                MDC.clear();
            } else {
                MDC.setContextMap(context);
            }
            setTraceIdIfAbsent();
            try {
                runnable.run();
            } finally {
                MDC.clear();
            }
        };
    }
}

三:在往線程池放任務的時候做請求鏈路id傳遞

/**
 * 線程池添加 [ai server 相關操作(psot)]任務
 *
 * @param task 添加的任務
 */
public static void addSendPostThreadToThreadPool(SendPostThread task) {
    log.info("addSendPostThreadToThreadPool pool:{}, task:{}", pool, task);
    try {
        pool.execute(ThreadMdcUtil.wrap(task, MDC.getCopyOfContextMap()));
    } catch (Exception e) {
        log.error("addSendPostThreadToThreadPool error pool:{}, task:{}, e:", pool, task, e);
    }
}

四:在日志配置里將鏈路追蹤id加入日志輸出格式的配置里

<!-- 日志輸出格式 (其中%X{TRACE_ID}是mdc里邊鏈路請求id的key,user-%X{USER}是用戶信息的key)-->
<property name="ENCODER_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %X{TRACE_ID} user-%X{USER} %-5level %logger{32}-[%line] - %msg%n"/>

到此spring 項目實現(xiàn)帶請求鏈路id的日志記錄就完成了

到此這篇關于Spring項目如何實現(xiàn)帶請求鏈路id的日志記錄的文章就介紹到這了,更多相關Spring請求id日志記錄內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Java synchronized偏向鎖的核心原理詳解

    Java synchronized偏向鎖的核心原理詳解

    這篇文章主要為大家詳細介紹了Java synchronized偏向鎖的核心原理,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03
  • SpringBoot創(chuàng)建JSP登錄頁面功能實例代碼

    SpringBoot創(chuàng)建JSP登錄頁面功能實例代碼

    這篇文章主要介紹了SpringBoot創(chuàng)建JSP登錄頁面功能實例代碼,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2017-04-04
  • springboot讀取文件,打成jar包后訪問不到的解決

    springboot讀取文件,打成jar包后訪問不到的解決

    這篇文章主要介紹了springboot讀取文件,打成jar包后訪問不到的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • SpringBoot項目發(fā)送釘釘消息功能實現(xiàn)

    SpringBoot項目發(fā)送釘釘消息功能實現(xiàn)

    在工作中的一些告警需要發(fā)送釘釘通知,有的是發(fā)給個人,有的要發(fā)到群里,這時項目就需要接入釘釘,實現(xiàn)發(fā)消息的功能,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2024-02-02
  • httpclient的CPool定義方法詳解

    httpclient的CPool定義方法詳解

    這篇文章主要為大家介紹了httpclient的CPool定義方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-10-10
  • Java將不同的List集合復制到另一個集合常見的方法

    Java將不同的List集合復制到另一個集合常見的方法

    在Java中,有時候我們需要將一個List對象的屬性值復制到另一個List對象中,使得兩個對象的屬性值相同,這篇文章主要介紹了Java將不同的List集合復制到另一個集合常見的方法,需要的朋友可以參考下
    2024-09-09
  • 教你輕松制作java視頻播放器

    教你輕松制作java視頻播放器

    這篇文章主要為大家詳細介紹了如何編寫屬于自己的java視頻播放器,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • 解決slf4j 和 logback-classic遇到的坑

    解決slf4j 和 logback-classic遇到的坑

    這篇文章主要介紹了解決slf4j 和 logback-classic遇到的坑,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • java中對象和Map互相轉換的幾種常見方式舉例

    java中對象和Map互相轉換的幾種常見方式舉例

    Map在日常開發(fā)應用中的頻率很高,最常用的實現(xiàn)類是HashMap和有序的TreeMap,下面這篇文章主要給大家介紹了關于java中對象和Map互相轉換的幾種常見方式舉例,需要的朋友可以參考下
    2024-01-01
  • Java 多線程死鎖的產(chǎn)生以及如何避免死鎖

    Java 多線程死鎖的產(chǎn)生以及如何避免死鎖

    這篇文章主要介紹了Java 多線程死鎖的產(chǎn)生以及如何避免死鎖,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-09-09

最新評論

大港区| 和平县| 博爱县| 措美县| 高淳县| 泰来县| 四子王旗| 饶河县| 凌海市| 绍兴市| 霍林郭勒市| 会同县| 西峡县| 克山县| 枣强县| 永和县| 临泽县| 珠海市| 淳安县| 探索| 尼玛县| 东安县| 山阴县| 兴业县| 安化县| 呼伦贝尔市| 尚志市| 天柱县| 浦江县| 奇台县| 安义县| 武邑县| 九江县| 延长县| 巴南区| 库尔勒市| 苍山县| 莎车县| 商丘市| 错那县| 河津市|