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

如何為Logback日志添加唯一追蹤ID

 更新時間:2024年12月16日 09:56:43   作者:Mistra丶  
本文介紹了如何為Logback日志添加唯一追蹤ID,以便在測試和調(diào)試時更容易定位報錯信息,通過創(chuàng)建過濾器和修改配置文件,可以在每個請求的日志中添加唯一的ID,并將其返回給前端,這樣,當(dāng)用戶反饋報錯時,開發(fā)人員可以根據(jù)ID快速定位和解決問題

為Logback日志添加唯一追蹤ID

平常在測試的時候,不容易定位報錯信息,這個時候給日志加上唯一的追蹤ID,查找日志的時候就非常方便了。

像這樣:

每個請求打印的日志都會有不同的ID,哪個請求出錯,根據(jù)ID來定位日志就行了。

這個ID還會返回給前端,前端發(fā)現(xiàn)報錯讓后臺找原因的話只需要給個ID,后臺開發(fā)人員就能根據(jù)

環(huán)境:

  • SpringBoot - 2.1.5.RELEASE
  • JDK8

一、創(chuàng)建過濾器

  • LogMDCFilter.java
public class LogMDCFilter implements Filter {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        String requestIdKey = "requestId";
        String requestId = UUID.randomUUID().toString();
        MDC.put(requestIdKey, requestId);

        String levelName = "logLevel";
        String value = servletRequest.getParameter(levelName);
        if (StringUtils.isNotBlank(value)) {
        	//org.slf4j.MDC
            MDC.put(levelName, value.toUpperCase());
        }

        try {
            filterChain.doFilter(servletRequest, servletResponse);
        } finally {
            MDC.remove(requestIdKey);
            MDC.remove(levelName);
        }
    }

    @Override
    public void destroy() {

    }
}
  • DebugLogTurboFilter.java
public class DebugLogTurboFilter extends TurboFilter {

    @Override
    public FilterReply decide(Marker marker, Logger logger, Level level, String format, Object[] params, Throwable t) {
        int levelInt = level.toInt();
        String levelName = MDC.get("logLevel");
        if (StringUtils.isBlank(levelName) || "DEBUG,INFO,TRACE,WARN".indexOf(levelName) == -1) {
            return FilterReply.NEUTRAL;
        }
        if ((Level.TRACE.levelStr.equals(levelName) && levelInt >= Level.TRACE_INT)
                || (Level.DEBUG.levelStr.equals(levelName) && levelInt >= Level.DEBUG_INT)
                || (Level.INFO.levelStr.equals(levelName) && levelInt >= Level.INFO_INT)
                || (Level.WARN.levelStr.equals(levelName) && levelInt >= Level.WARN_INT)) {
            return FilterReply.ACCEPT;
        }
        return FilterReply.DENY;
    }
}

二、注冊過濾器

  • FilterConfiguration.java
@Configuration
public class FilterConfiguration {

    @Bean
    public FilterRegistrationBean logFilterRegistration() {
        FilterRegistrationBean registration = new FilterRegistrationBean();
        //注入過濾器
        registration.setFilter(new LogMDCFilter());
        //攔截規(guī)則
        registration.addUrlPatterns("/*");
        //過濾器名稱
        registration.setName("logMDCFilter");
        //過濾器順序
        registration.setOrder(0);
        return registration;
    }
}

三、Logback.xml

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%date{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36}:%line - %msg %X{requestId}%n
            </pattern>
        </encoder>
    </appender>
	//上面的 DebugLogTurboFilter
    <turboFilter class="com.example.common.config.DebugLogTurboFilter">
    </turboFilter>

    <appender name="rollingFile" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>/home/logs/merchant/common-merchant.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>/home/logs/merchant/history/merchant.%d{yyyy-MM-dd HH}.%i.log</fileNamePattern>
            <maxHistory>30</maxHistory>
            <maxFileSize>3MB</maxFileSize>
        </rollingPolicy>
        <encoder>
            <pattern>%date{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36}:%line - %msg %X{requestId}%n
            </pattern>
        </encoder>
    </appender>

    <!-- project default level -->
    <logger name="com.version" level="DEBUG"/>
    <logger name="org.springframework.web.servlet.handler" level="INFO"/>
    <logger name="com.example.user.mapper" level="DEBUG"/>
    <!--log4jdbc -->
    <logger name="org.springframework.jdbc.core.JdbcTemplate" level="INFO"/>

    <root level="INFO">
        <appender-ref ref="console"/>
        <appender-ref ref="rollingFile"/>
    </root>
</configuration>

注意配置中的{requestId}占位符,這個就會替換為生成的唯一日志ID。

四、返回值封裝

  • ResponseModel.java
public class ResponseModel implements Serializable {

    private static final long serialVersionUID = -8972819161141262263L;

    @ApiModelProperty(value = "是否處理成功", name = "success", example = "true")
    private Boolean success;
    @ApiModelProperty(value = "返回碼", name = "code", example = "200")
    private Integer code;
    @ApiModelProperty(value = "處理消息", name = "msg", example = "處理成功")
    private String msg;
    @ApiModelProperty(value = "返回數(shù)據(jù)", name = "data", example = "{}")
    private Object data;
    private String requestId = MDC.get("requestId");
    }

代碼寫完了,前端每次請求,如果有返回值的話,都會收到唯一日志ID,如圖:

可以根據(jù)requestId,通過此命令在日志文件中查找對應(yīng)的日志

cat common-user.log | grep -C 10 f11819ea-6169-4c13-8032-979a88977575

總結(jié)

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Kotlin語言編程Regex正則表達式實例詳解

    Kotlin語言編程Regex正則表達式實例詳解

    這篇文章主要為大家介紹了Kotlin語言編程Regex正則表達式實例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-08-08
  • Java程序數(shù)據(jù)庫連接滿問題的排查指南

    Java程序數(shù)據(jù)庫連接滿問題的排查指南

    這篇文章主要介紹了Java應(yīng)用數(shù)據(jù)庫連接滿問題的識別、診斷、原因排查及解決方案,提出通過監(jiān)控、代碼優(yōu)化、配置調(diào)整和預(yù)防措施,結(jié)合Arthas等工具,有效應(yīng)對和預(yù)防該問題,需要的朋友可以參考下
    2025-07-07
  • spring data簡化jpa開發(fā)_動力節(jié)點Java學(xué)院整理

    spring data簡化jpa開發(fā)_動力節(jié)點Java學(xué)院整理

    這篇文章主要介紹了spring data簡化jpa開發(fā),本文主要講述 Spring Data JPA,希望能夠深入學(xué)習(xí) Spring 和 JPA,有興趣的可以了解下
    2017-09-09
  • Maven打包之解決沒有依賴jar包問題及分析

    Maven打包之解決沒有依賴jar包問題及分析

    用戶使用Maven打包FTPServer程序時,因未配置依賴打包導(dǎo)致jar體積過小且運行報錯,解決方法是添加maven-assembly插件生成包含依賴的jar包,確保程序正常運行
    2025-09-09
  • 簡單實現(xiàn)Java版學(xué)生管理系統(tǒng)

    簡單實現(xiàn)Java版學(xué)生管理系統(tǒng)

    這篇文章主要為大家詳細介紹了簡單實現(xiàn)Java版學(xué)生管理系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-06-06
  • Spring Cloud多個微服務(wù)之間調(diào)用代碼實例

    Spring Cloud多個微服務(wù)之間調(diào)用代碼實例

    這篇文章主要介紹了Spring Cloud多個微服務(wù)之間調(diào)用代碼實例,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-12-12
  • Spring Security添加驗證碼的兩種方式小結(jié)

    Spring Security添加驗證碼的兩種方式小結(jié)

    使用spring security的時候,框架會幫我們做賬戶密碼的驗證,但是如我們需要添加一個驗證碼,就需要對配置文件進行修改,這篇文章主要給大家介紹了關(guān)于Spring Security添加驗證碼的兩種方式,需要的朋友可以參考下
    2021-10-10
  • AI算法實現(xiàn)五子棋(java)

    AI算法實現(xiàn)五子棋(java)

    這篇文章主要為大家詳細介紹了AI算法實現(xiàn)五子棋,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-09-09
  • SpringBoot返回Json對象報錯(返回對象為空{(diào)})

    SpringBoot返回Json對象報錯(返回對象為空{(diào)})

    本文主要介紹介紹了SpringBoot返回Json對象報錯(返回對象為空{(diào)}),文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • 如何實現(xiàn)Spring?Event(異步事件)

    如何實現(xiàn)Spring?Event(異步事件)

    這篇文章主要介紹了如何實現(xiàn)Spring?Event(異步事件)問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-02-02

最新評論

弥渡县| 县级市| 邵阳市| 清丰县| 湟源县| 慈利县| 成安县| 寻乌县| 武义县| 玛沁县| 城市| 荃湾区| 宁夏| 长汀县| 马边| 宜章县| 乾安县| 通辽市| 尼玛县| 楚雄市| 西城区| 阳春市| 吉林市| 荔浦县| 梅河口市| 江津市| 肥乡县| 桦川县| 台前县| 北安市| 雅江县| 宁化县| 望江县| 合肥市| 蒙山县| 正阳县| 永胜县| 峡江县| 涟源市| 北辰区| 新龙县|