国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

SpringBoot增加全局traceId日志追蹤

這篇具有很好參考價值的文章主要介紹了SpringBoot增加全局traceId日志追蹤。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

實現(xiàn)思路

  1. 增加Filter處理請求,生成traceId保存到TreadLocal中(slf4j的MDC)
  2. 增加返回AOP切面,返回數(shù)據(jù)之前把traceId寫到返回實體里
  3. 日志logback.xml文件配置增加traceId打印

注意:線程池執(zhí)行和其他服務(wù)請求會丟失traceId,需要再做包裝,這里不實現(xiàn)文章來源地址http://www.zghlxwxcb.cn/news/detail-824242.html

定義過濾器

/**
 * @author lenjor
 * @description requst包裝類,構(gòu)建可重復(fù)讀取inputStream的request
 * @date 2024-01-24 11:13
 */
public class RepeatedlyRequestWrapper extends HttpServletRequestWrapper {
    private final byte[] body;

    public RepeatedlyRequestWrapper(HttpServletRequest request) throws IOException {
        super(request);
        body = HttpHelper.getBodyString(request).getBytes(StandardCharsets.UTF_8);
    }

    @Override
    public BufferedReader getReader() throws IOException {
        return new BufferedReader(new InputStreamReader(getInputStream()));
    }

    @Override
    public ServletInputStream getInputStream() throws IOException {
        final ByteArrayInputStream bais = new ByteArrayInputStream(body);
        return new ServletInputStream() {
            @Override
            public int read() throws IOException {
                return bais.read();
            }

            @Override
            public int available() throws IOException {
                return body.length;
            }

            @Override
            public boolean isFinished() {
                return false;
            }

            @Override
            public boolean isReady() {
                return false;
            }

            @Override
            public void setReadListener(ReadListener readListener) {

            }
        };
    }
}


/**
 * @author lenjor
 * @Description 全局請求增加traceId日志追蹤,保存到ThreadLocal的MDC中
 * @Date 2024-01-24 15:29
 */
public class TraceIdFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        Filter.super.init(filterConfig);
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        try {
            HttpServletRequest httpRequest = (HttpServletRequest) request;
            String oldTraceId = httpRequest.getHeader("traceId");

            if(!StringUtils.isEmpty(oldTraceId)){
                MDC.put("traceId",oldTraceId);
            }else {
                // 生成唯一的traceId
                MDC.put("traceId", UUID.randomUUID().toString().replace("-", ""));
            }
            if (request instanceof HttpServletRequest && StringUtils.startsWithIgnoreCase(request.getContentType(), MediaType.APPLICATION_JSON_VALUE)) {
                ServletRequest requestWrapper = new RepeatedlyRequestWrapper((HttpServletRequest) request);
                chain.doFilter(requestWrapper, response);
            }else {
                chain.doFilter(request, response);
            }
        } finally {
            // 清除MDC的traceId值,確保在請求結(jié)束后不會影響其他請求的日志
            MDC.remove("traceId");
        }
    }

    @Override
    public void destroy() {
        Filter.super.destroy();
    }
}

/**
 * @author lenjor
 * @Description web請求全局traceId處理
 * @Date 2024-01-24 15:35
 */
@Configuration
public class GlobalWebTraceIdConfig {
    @Bean
    public FilterRegistrationBean<TraceIdFilter> loggingFilter() {
        FilterRegistrationBean<TraceIdFilter> registrationBean = new FilterRegistrationBean<>();
        registrationBean.setFilter(new TraceIdFilter());
        registrationBean.addUrlPatterns("/*"); // 設(shè)置過濾的URL模式
        return registrationBean;
    }
}

返回參數(shù)增加traceId

/**
 * @author lenjor
 * @Description 請求返回AOP切面增強,增加traceId返回
 * @Date 2024-01-24 16:06
 */
@ControllerAdvice(basePackages = "com.yingzi.idp.edge.app.v2.interfaces.rest")
public class TraceIdResponseAdvice implements ResponseBodyAdvice<ResultDTO> {
    @Override
    public boolean supports(MethodParameter returnType, Class<? extends HttpMessageConverter<?>> converterType) {
        return returnType.getMethod().getReturnType().isAssignableFrom(ResultDTO.class);
    }

    @Override
    public ResultDTO beforeBodyWrite(ResultDTO body, MethodParameter returnType, MediaType selectedContentType, Class<? extends HttpMessageConverter<?>> selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) {
        if (Objects.nonNull(body)) {
            body.setTraceId(MDC.get("traceId"));
        }
        return body;
    }
}

logback.xml增加traceId

        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>
                %d{yyyy-MM-dd HH:mm:ss.SSS} %-5level [%thread]{traceId: %X{traceId}}::: %class{0}.%method\(%line\)
                %msg%n
            </pattern>
        </encoder>

到了這里,關(guān)于SpringBoot增加全局traceId日志追蹤的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 【Java】Spring Boot 日志文件

    【Java】Spring Boot 日志文件

    日志是程序的重要組成部分,想象一下,如果程序報錯了,不讓你打開控制臺看日志,那么你能找到報錯的原因嗎。 日志對于我們來說,最主要的用途就是排除和定位問題。除了發(fā)現(xiàn)和定位問題之外,我們還可以通過日志實現(xiàn)以下功能: 記錄用戶登錄日志,方便分析用戶是

    2024年02月01日
    瀏覽(46)
  • Java EE 突擊 9 - Spring Boot 日志文件

    Java EE 突擊 9 - Spring Boot 日志文件

    這個專欄給大家介紹一下 Java 家族的核心產(chǎn)品 - SSM 框架 JavaEE 進階專欄 Java 語言能走到現(xiàn)在 , 仍然屹立不衰的原因 , 有一部分就是因為 SSM 框架的存在 接下來 , 博主會帶大家了解一下 Spring、Spring Boot、Spring MVC、MyBatis 相關(guān)知識點 并且?guī)ьI(lǐng)大家進行環(huán)境的配置 , 讓大家真正用好

    2024年02月13日
    瀏覽(22)
  • Java實戰(zhàn):Spring Boot實現(xiàn)AOP記錄操作日志

    本文將詳細介紹如何在Spring Boot應(yīng)用程序中使用Aspect Oriented Programming(AOP)來實現(xiàn)記錄操作日志的功能。我們將探討Spring Boot集成AOP的基本概念,以及如何使用Spring Boot實現(xiàn)AOP記錄操作日志。最后,我們將通過一個具體示例來演示整個實現(xiàn)過程。本文適合已經(jīng)具備Spring Boot基礎(chǔ)

    2024年02月22日
    瀏覽(21)
  • Kafka增加安全驗證安全認證,SASL認證,并通過spring boot-Java客戶端連接配置

    公司Kafka一直沒做安全驗證,由于是誘捕程序故需要面向外網(wǎng)連接,需要增加Kafka連接驗證,保證Kafka不被非法連接,故開始研究Kafka安全驗證 使用Kafka版本為2.4.0版本,主要參考官方文檔 官網(wǎng)對2.4版本安全驗證介紹以及使用方式地址: https://kafka.apache.org/24/documentation.html#secu

    2024年02月01日
    瀏覽(93)
  • 【全鏈路追蹤】XXL-JOB添加TraceID

    首先這個項目屬于小型項目,由于人手以及時間限制,并未引入Skywalking等中間件來做調(diào)用鏈路追蹤。Skywalking不在此次的討論范圍中。 其次介紹一下項目的相關(guān)背景 項目中主要有兩種調(diào)用路徑 Web請求走統(tǒng)一的網(wǎng)關(guān)入口,調(diào)用后端服務(wù) XXL-JOB定時任務(wù)執(zhí)行調(diào)度 Kubernetes 走統(tǒng)一網(wǎng)

    2024年02月11日
    瀏覽(17)
  • Spring Cloud Gateway日志級別鏈路追蹤設(shè)計

    ? 為了配合日志分析系統(tǒng)ELK(ElasticSearch,Logstash,Kibana)方便解析日志文件,需要對日志文件的輸出格式進行JSON格式化,我這里使用的日志工具是logback(幸運的躲過了log4j的漏洞)+logstash-encoder包進行的封裝的一個日志插件,該插件實現(xiàn)了日志JSON格式化,適配了多種中間件的鏈

    2024年02月11日
    瀏覽(18)
  • springboot增加logback日志記錄ip

    springboot增加logback日志記錄ip

    1、增加logback配置文件: 2、增加獲取ip工具類: 3、增加logbackxml配置 ?完整xml:

    2024年02月11日
    瀏覽(20)
  • Spring Boot中集成各種日志框架Logback、Log4j2和Java Util Logging

    Spring Boot中集成各種日志框架Logback、Log4j2和Java Util Logging

    Spring Boot支持多種日志框架,包括Logback、Log4j2和Java Util Logging(JUL)。在Spring Boot中,可以通過簡單的配置來集成這些熱門的日志框架。 下面將詳細說明如何集成Logback、Log4j2和Java Util Logging,并提供相應(yīng)的源代碼示例。 集成Logback: Logback是Spring Boot默認的日志框架,它提供了高

    2024年02月05日
    瀏覽(53)
  • dubbo3+sleuth+brave實現(xiàn)鏈路追蹤及traceId未傳遞或不對應(yīng)的原因分析

    dubbo3+sleuth+brave實現(xiàn)鏈路追蹤及traceId未傳遞或不對應(yīng)的原因分析

    筆者之前一直使用SpringCloud Alibaba + dubbo2 + nacos1.4進行開發(fā),但是目前naocs2、dubbo3也已經(jīng)推出有一段時間并逐漸達到生產(chǎn)環(huán)境可用狀態(tài),所以筆者也希望用最新版本的nacos2及dubbo3嘗嘗鮮。但在搭建框架的過程中遇到了鏈路追蹤的問題,所以在這里詳細記錄一下。 筆者基于dubbo

    2024年02月10日
    瀏覽(31)
  • SpringCloudGateway使用Skywalking時日志打印traceId

    Skywalking oap 與 agent部署 https://blog.csdn.net/kismet2399/article/details/131560171 spring-cloud-starter-gateway:3.1.4 Skywalking Agent:8.14.0 SpringCloudGateway集成Skywalking后無法打印traceId 目前沒有找到logback的解決方式,所以日志打印改用log4j2 mvn添加配置 讓日志獲取到traceId 插件添加 將skywalking-agent下opt

    2024年02月13日
    瀏覽(26)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包