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

SpringBoot使用TraceId進(jìn)行日志追蹤的實(shí)現(xiàn)

 更新時(shí)間:2025年01月09日 15:54:02   作者:陪你翱翔直到世界盡頭  
本文主要介紹了SpringBoot使用TraceId進(jìn)行日志追蹤的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

查詢?nèi)罩镜耐袋c(diǎn):項(xiàng)目中每當(dāng)我們查詢?nèi)罩镜臅r(shí)候都是看前端請(qǐng)求什么接口,根據(jù)一些關(guān)鍵字進(jìn)入服務(wù)器查詢?nèi)罩局惺欠裼羞@個(gè)關(guān)鍵字,然而這個(gè)關(guān)鍵字在日志里面并不是唯一的,所以要生成一個(gè)唯一的標(biāo)識(shí),每一次請(qǐng)求都是唯一的一串字符,查詢會(huì)過濾掉很多無用的信息,快捷查找到這次請(qǐng)求。為了解決這個(gè)痛點(diǎn),就使用了TraceId。

一、TraceId 定義

用于標(biāo)識(shí)某一次具體的請(qǐng)求ID。當(dāng)用戶的請(qǐng)求進(jìn)入系統(tǒng)后,會(huì)在RPC調(diào)用網(wǎng)絡(luò)的第一層生成一個(gè)全局唯一的traceId,并且會(huì)隨著每一層的RPC調(diào)用,不斷往后傳遞,這樣的話通過traceId就可以把一次用戶請(qǐng)求在系統(tǒng)中調(diào)用的路徑串聯(lián)起來。

在分布式系統(tǒng)中,一個(gè)請(qǐng)求可能會(huì)涉及多個(gè)服務(wù)和組件的調(diào)用,而traceId可以幫助我們追蹤和查看整個(gè)請(qǐng)求的流程和調(diào)用鏈

二、TraceId的請(qǐng)求流程

在最開始請(qǐng)求系統(tǒng)時(shí)候生成一個(gè)全局唯一的traceId,放在http 請(qǐng)求header中,系統(tǒng)接收到請(qǐng)求后,從header中取出這個(gè)traceId,放入MDC中,這個(gè)traceId伴隨著這整個(gè)請(qǐng)求的調(diào)用周期,即當(dāng)一個(gè)服務(wù)調(diào)用另外一個(gè)服務(wù)的時(shí)候,需要將traceId往下傳遞,從而形成一條鏈路。

注意:這次的traceId主要是用UUID來生成的,前端生成traceId,后端攔截器攔截到了做一層判斷,如果前端有,就不需要后端生成,而且只需要將前端的這個(gè)traceId發(fā)給后端人員,后端人員就能直接能定位到日志,不需要再讓前端給請(qǐng)求的是什么接口,所以建議是前端來生成traceId。

三、SpringBoot整合TraceId

(一)添加一個(gè)logback.xml

logback.xml內(nèi)容如下:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <property name="LOG_PATH" value="/xxx/log"/>  <!-- 項(xiàng)目的日志路徑 -->
    <property name="LOG_FILE" value="xxx"/>
    <property name="DATE_PATH" value="${LOG_PATH}/%d{yyyy-MM-dd}"/>

    <!-- 日志輸出格式 -->
    <property name="log.pattern.console"
              value="%red(%d{yyyy-MM-dd HH:mm:ss}) %green([%thread]) [traceId:%X{traceId}] %highlight(%-5level) %boldMagenta(%logger{10}) - %cyan(%msg%n)"/>
    <property name="log.pattern.file"
              value="%d{HH:mm:ss.SSS} [%thread] [traceId:%X{traceId}] %-5level %logger{20} - [%method,%line] - %msg%n"/>
    <include resource="org/springframework/boot/logging/logback/defaults.xml"/>
    <include resource="org/springframework/boot/logging/logback/console-appender.xml"/>
    <!-- 控制臺(tái)輸出 -->
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>${log.pattern.console}</pattern>
            <charset>utf8</charset>
        </encoder>
    </appender>
    <!-- 日志文件fzwyapi-admin.log -->
    <appender name="fileAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${LOG_PATH}/${LOG_FILE}.log</file>
        <append>true</append>
        <encoder>
<!--            <pattern>${CONSOLE_LOG_PATTERN}</pattern>-->
            <pattern>${log.pattern.file}</pattern>
        </encoder>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>
                ${DATE_PATH}/%i.log
            </fileNamePattern>
            <maxHistory>15</maxHistory>
            <totalSizeCap>20GB</totalSizeCap>
            <maxFileSize>50MB</maxFileSize>
        </rollingPolicy>
    </appender>

    <appender name="fileError" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>ERROR</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
        <file>${LOG_PATH}/${LOG_FILE}.error.log</file>
        <append>true</append>
        <encoder>
            <!--            <pattern>${CONSOLE_LOG_PATTERN}</pattern>-->
            <pattern>${log.pattern.file}</pattern>
        </encoder>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>
                ${DATE_PATH}/%i.error.log
            </fileNamePattern>
            <maxHistory>15</maxHistory>
            <totalSizeCap>20GB</totalSizeCap>
            <maxFileSize>50MB</maxFileSize>
        </rollingPolicy>
    </appender>

    <root level="info">
        <appender-ref ref="fileAppender"/>
        <appender-ref ref="fileError"/>
        <appender-ref ref="STDOUT"/>
    </root>

</configuration>

(二)添加TraceId工具類

TraceIdUtil.java

package xxx;

import org.slf4j.MDC;

import java.util.UUID;

/**
 * @author lyc
 * @date 2024/10/17
 * @funtion
 */
public class TraceIdUtil {
    public static final String TRACE_ID = "traceId";

    public static String getTraceId() {
        String traceId = MDC.get(TRACE_ID);
        return traceId == null ? "" : traceId;
    }

    public static void setTraceId(String traceId) {
        MDC.put(TRACE_ID, traceId);
    }

    public static void remove() {
        MDC.remove(TRACE_ID);
    }

    public static void clear() {
        MDC.clear();
    }

    public static String generateTraceId() {
        return UUID.randomUUID().toString().replace("-", "");
    }
}

(三)添加TraceId攔截器

SystemTraceIdInterceptor.java

package xxx;

import xxx.TraceIdUtil;
import org.slf4j.MDC;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * @author lyc
 * @date 2024/10/17
 * @funtion
 */
@Component
public class SystemTraceIdInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
        //如果有上層調(diào)用就用上層的ID
        String traceId = request.getHeader(TraceIdUtil.TRACE_ID);
        if (traceId == null) {
            traceId = TraceIdUtil.generateTraceId();
        }
        MDC.put(TraceIdUtil.TRACE_ID, traceId);

        //配置traceId到響應(yīng)header中
        response.setHeader(TraceIdUtil.TRACE_ID, MDC.get(TraceIdUtil.TRACE_ID));

        return true;
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
        //調(diào)用結(jié)束后刪除
        MDC.remove(TraceIdUtil.TRACE_ID);
    }
}

(四)InterceptorConfig配置TraceId攔截器

TraceIdUtil.java

package xxx.config;

import xxx.SystemTraceIdInterceptor;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

import javax.annotation.Resource;

/**
 * @author lyc
 * @updated: 2024/10/17
 * @funtion
 */
@Configuration
public class InterceptorConfig implements WebMvcConfigurer {

    @Resource
    private SystemTraceIdInterceptor systemTraceIdInterceptor;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        //配置鏈路追蹤traceId攔截器
        registry.addInterceptor(systemTraceIdInterceptor).addPathPatterns("/**");
    }

}

四、效果

到此這篇關(guān)于SpringBoot使用TraceId進(jìn)行日志追蹤的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)SpringBoot TraceId日志追蹤內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java Stream 的 collect 與 reduce 操作示例詳解

    Java Stream 的 collect 與 reduce 

    在 Java Stream API 中,collect?和?reduce?是兩種強(qiáng)大的終止操作,用于將流中的元素累積為最終結(jié)果,本文將從核心概念、使用場(chǎng)景、性能特性等多個(gè)維度進(jìn)行對(duì)比分析,感興趣的朋友跟隨小編一起看看吧
    2025-09-09
  • java的arraylist排序示例(arraylist用法)

    java的arraylist排序示例(arraylist用法)

    這篇文章主要介紹了java的arraylist排序示例,學(xué)習(xí)一下arraylist的用法,需要的朋友可以參考下
    2014-03-03
  • Springboot整合Dubbo+Nacos實(shí)現(xiàn)RPC調(diào)用的示例代碼

    Springboot整合Dubbo+Nacos實(shí)現(xiàn)RPC調(diào)用的示例代碼

    隨著互聯(lián)網(wǎng)技術(shù)的飛速發(fā)展,越來越多的企業(yè)和開發(fā)者開始關(guān)注微服務(wù)架構(gòu),Nacos是阿里巴巴開源的一個(gè)動(dòng)態(tài)服務(wù)發(fā)現(xiàn)、配置管理和服務(wù)管理平臺(tái),本文講解如何將Spring Boot與Dubbo和Nacos整合,實(shí)現(xiàn)RPC調(diào)用,需要的朋友可以參考下
    2024-02-02
  • JAVA編程實(shí)現(xiàn)TCP網(wǎng)絡(luò)通訊的方法示例

    JAVA編程實(shí)現(xiàn)TCP網(wǎng)絡(luò)通訊的方法示例

    這篇文章主要介紹了JAVA編程實(shí)現(xiàn)TCP網(wǎng)絡(luò)通訊的方法,簡(jiǎn)單說明了TCP通訊的原理并結(jié)合具體實(shí)例形式分析了java實(shí)現(xiàn)TCP通訊的步驟與相關(guān)操作技巧,需要的朋友可以參考下
    2017-08-08
  • Java的MD5工具類和客戶端測(cè)試類

    Java的MD5工具類和客戶端測(cè)試類

    這篇文章主要介紹了Java的MD5工具類和客戶端測(cè)試類,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2021-12-12
  • 又又叕出BUG啦!理智分析Java NIO的ByteBuffer到底有多難用

    又又叕出BUG啦!理智分析Java NIO的ByteBuffer到底有多難用

    網(wǎng)絡(luò)數(shù)據(jù)的基本單位永遠(yuǎn)是byte,Java NIO提供ByteBuffer作為字節(jié)的容器,但該類過于復(fù)雜,有點(diǎn)難用.本篇文章就帶大家簡(jiǎn)單了解一下 ,需要的朋友可以參考下
    2021-06-06
  • 談?wù)勀憧赡懿⒉涣私獾膉ava枚舉

    談?wù)勀憧赡懿⒉涣私獾膉ava枚舉

    這篇文章主要給大家介紹了一些關(guān)于你可能并不了解的java枚舉的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • Win10?IDEA如何連接虛擬機(jī)中的Hadoop(HDFS)

    Win10?IDEA如何連接虛擬機(jī)中的Hadoop(HDFS)

    在虛擬機(jī)上配置Hadoop并修改core-site.xml文件,設(shè)置IP為局域網(wǎng)地址,IDEA中創(chuàng)建Maven項(xiàng)目,添加依賴,并檢查Hadoop重啟和端口轉(zhuǎn)發(fā),提供test.bat文件,通過修改IP簡(jiǎn)化使用過程
    2024-11-11
  • Java線程安全中的單例模式

    Java線程安全中的單例模式

    這篇文章主要介紹了Java線程安全中的單例模式,需要的朋友可以參考下
    2015-02-02
  • 關(guān)于druid配置參數(shù)的使用詳解

    關(guān)于druid配置參數(shù)的使用詳解

    這篇文章主要介紹了關(guān)于druid配置參數(shù)的使用,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2025-06-06

最新評(píng)論

宁晋县| 张家口市| 新巴尔虎右旗| 凤冈县| 临沧市| 宁城县| 新津县| 海伦市| 新龙县| 准格尔旗| 延安市| 鄯善县| 罗甸县| 长乐市| 个旧市| 繁昌县| 仁怀市| 乡宁县| 嘉兴市| 江达县| 巩留县| 临城县| 达州市| 吉木乃县| 龙海市| 老河口市| 深泽县| 漯河市| 十堰市| 汝城县| 荥经县| 永胜县| 资中县| 海南省| 普兰县| 大方县| 武隆县| 平安县| 天全县| 湘阴县| 永定县|