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

詳解如何為SpringBoot Web應(yīng)用的日志方便追蹤

 更新時(shí)間:2023年11月01日 08:33:32   作者:JAVA旭陽  
在Web應(yīng)用程序領(lǐng)域,有效的請求監(jiān)控和可追溯性對于維護(hù)系統(tǒng)完整性和診斷問題至關(guān)重要,SpringBoot是一種用于構(gòu)建Java應(yīng)用程序的流行框架,在本文中,我們探討了在SpringBoot中向日志添加唯一ID的重要性,需要的朋友可以參考下

前言

在 Web 應(yīng)用程序領(lǐng)域,有效的請求監(jiān)控和可追溯性對于維護(hù)系統(tǒng)完整性和診斷問題至關(guān)重要。Spring Boot 是一種用于構(gòu)建 Java 應(yīng)用程序的流行框架,它提供了強(qiáng)大的日志記錄功能,可以通過為每個(gè)傳入請求合并唯一標(biāo)識符來進(jìn)一步豐富這些功能。這種簡潔而強(qiáng)大的實(shí)踐使開發(fā)人員能夠跟蹤和分析單個(gè)請求流,從而簡化調(diào)試并增強(qiáng)整體系統(tǒng)的可靠性。在本文中,我們探討了在 Spring Boot 中向日志添加唯一 ID 的重要性,深入了解其實(shí)現(xiàn)以及它為應(yīng)用程序開發(fā)和維護(hù)帶來的眾多好處。

問題

如今,我們通常為每項(xiàng)服務(wù)配備多個(gè)服務(wù)器?,F(xiàn)在有兩種檢查日志的方法,第一種是進(jìn)入單個(gè)服務(wù)器實(shí)例并檢查日志。還有另一種方法可以從所有服務(wù)器收集日志,并且可以在一個(gè)地方查看它們。人們通常使用第二種方法來搜索和分析日志?,F(xiàn)在,單個(gè)服務(wù)的多個(gè)服務(wù)器有如此多的日志,跟蹤日志變得很困難。

此外,即使我們有一個(gè)服務(wù)的單個(gè)服務(wù)器,由于并發(fā)請求/線程,也會打印許多日志。面臨的一個(gè)主要問題是跟蹤,因?yàn)槿罩疽越诲e(cuò)方式打印。跟蹤打印的日志變得非常困難。

解決方案

為了解決上述問題,我們需要某種與每個(gè)日志條目關(guān)聯(lián)的標(biāo)識符。我們可以生成一個(gè)唯一的 ID,然后將該 ID 分配給特定請求的所有日志。因此,為特定請求生成的所有日志都將具有唯一的 ID。借助這個(gè)ID,我們可以輕松地通過日志進(jìn)行追蹤。我們可以在日志中搜索這個(gè)ID并獲取特定請求的所有日志。為了在 Spring Boot 中實(shí)現(xiàn)這一點(diǎn),我們可以使用 AOP。

面向方面編程(AOP)是一種編程范式,允許開發(fā)人員將橫切關(guān)注點(diǎn)(例如日志記錄、安全性和事務(wù)管理)模塊化,與核心業(yè)務(wù)邏輯分開,從而提高代碼的可重用性和可維護(hù)性。它通過引入“方面”來實(shí)現(xiàn)這一點(diǎn),這些“方面”可以應(yīng)用于代碼庫的不同部分,而無需更改原始代碼。

首先,您必須創(chuàng)建一個(gè)如下所示的請求過濾器。

/**
 * A filter that adds a key to the Mapped Diagnostic Context (MDC) to each request so you can print a unique id in the log messages of each request
 **/
@EqualsAndHashCode(callSuper = false)
@Component
@Slf4j
public class Slf4jMDCFilter extends OncePerRequestFilter {

    @Override
    protected void doFilterInternal(final HttpServletRequest request, final HttpServletResponse response, final FilterChain chain) {
        try {
            MDC.put(MDC_UUID_TOKEN_KEY, UUID.randomUUID().toString());
            chain.doFilter(request, response);
        } catch (Exception ex) {
            log.error(ERROR_FORMAT, "Exception occurred in filter while setting UUID for logs", ex);
        } finally {
            MDC.remove(MDC_UUID_TOKEN_KEY);
        }
    }

    @Override
    protected boolean isAsyncDispatch(final HttpServletRequest request) {
        return false;
    }

    @Override
    protected boolean shouldNotFilterErrorDispatch() {
        return false;
    }
}

上述代碼針對每個(gè) API 請求運(yùn)行一次,并將相同的唯一 ID 添加到為特定請求生成的所有日志中。接下來,您必須將上述 AOP 過濾器注冊為 bean,如下所示:

@Configuration
@RequiredArgsConstructor
public class BeanConfig {
    private final Slf4jMDCFilter slf4jMDCFilter;

    @Bean
    public FilterRegistrationBean<Slf4jMDCFilter> servletRegistrationBean() {
        final FilterRegistrationBean<Slf4jMDCFilter> filterRegistrationBean = new FilterRegistrationBean<>();
        filterRegistrationBean.setFilter(slf4jMDCFilter);
        filterRegistrationBean.setOrder(2);
        return filterRegistrationBean;
    }
}

之后,您需要在日志文件中添加一個(gè)附加程序,如下所示:

<appender name="Console"
  class="ch.qos.logback.core.ConsoleAppender">
  <layout class="ch.qos.logback.classic.PatternLayout">
    <Pattern>
      %black(%d{ISO8601}) %X{Slf4jMDCFilter.UUID} %highlight(%-5level) [%blue(%t)] %yellow(%C{1.}): %msg%n%throwable
    </Pattern>
  </layout>
</appender>

總結(jié)

在 Spring Boot 中為每個(gè)請求在日志中實(shí)現(xiàn)唯一的 ID 可以通過關(guān)聯(lián)應(yīng)用程序不同組件之間的日志來實(shí)現(xiàn)更好的可跟蹤性和調(diào)試,特別是在并發(fā)場景中。這個(gè)唯一的標(biāo)識符有助于跟蹤請求流、識別潛在問題并提高整體系統(tǒng)的可觀察性。

以上就是詳解如何為Spring Boot Web應(yīng)用的日志方便追蹤的詳細(xì)內(nèi)容,更多關(guān)于Spring Boot Web日志追蹤的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Spring?Boot?攔截器幫助解鎖5種常用場景(推薦)

    Spring?Boot?攔截器幫助解鎖5種常用場景(推薦)

    在SpringBoot中,攔截器用于在請求處理前后插入自定義邏輯,實(shí)現(xiàn)權(quán)限校驗(yàn)、日志記錄、性能監(jiān)控等功能,本文給大家介紹Spring?Boot?攔截器幫助解鎖5大實(shí)用場景,感興趣的朋友跟隨小編一起看看吧
    2026-01-01
  • Java中的數(shù)組流ByteArrayOutputStream用法

    Java中的數(shù)組流ByteArrayOutputStream用法

    Java中的ByteArrayOutputStream是java.io包中的一個(gè)類,用于在內(nèi)存中創(chuàng)建字節(jié)數(shù)組緩沖區(qū),支持動態(tài)擴(kuò)展,它繼承自O(shè)utputStream,允許以字節(jié)形式寫入數(shù)據(jù),無需與外部設(shè)備交互,常用方法包括write()、toByteArray()、toString()等
    2024-09-09
  • 深入了解Java.Util.Date詳情

    深入了解Java.Util.Date詳情

    這篇文章主要介紹了Java.Util.Date,很少有類能像java.util.Date那樣在堆棧溢出方面引起如此多的類似問題,關(guān)于具體原因下文內(nèi)容詳細(xì)介紹,需要的朋友可以參考一下
    2022-06-06
  • 如何基于sqlite實(shí)現(xiàn)kafka延時(shí)消息詳解

    如何基于sqlite實(shí)現(xiàn)kafka延時(shí)消息詳解

    這篇文章主要給大家介紹了關(guān)于如何基于sqlite實(shí)現(xiàn)kafka延時(shí)消息的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2022-01-01
  • Spring中的@ExceptionHandler注解詳解與應(yīng)用示例

    Spring中的@ExceptionHandler注解詳解與應(yīng)用示例

    本文詳細(xì)介紹了Spring框架中的@ExceptionHandler注解的用法,包括基本用法、全局異常處理、結(jié)合@ResponseStatus注解以及返回值類型,通過示例展示了如何使用@ExceptionHandler注解處理不同類型的異常,并提供定制化的異常處理響應(yīng),需要的朋友可以參考下
    2024-11-11
  • java中Swing五種常見的布局方式

    java中Swing五種常見的布局方式

    本文通過代碼示例給大家詳細(xì)講解了java中Swing五種常見的布局方式,以及相關(guān)注意知識點(diǎn),有興趣的朋友參考學(xué)習(xí)下。
    2018-03-03
  • @Autowired注入為null的原因與解決方法

    @Autowired注入為null的原因與解決方法

    我們經(jīng)常會通過@Autowired注解將某個(gè)類注到另一個(gè)類中,但是會發(fā)現(xiàn)注不進(jìn)去,報(bào)NULL,所以本文就給大家分析了@Autowired 注入為null 的原因與解決方法,需要的朋友可以參考下
    2023-09-09
  • Java CAS底層實(shí)現(xiàn)原理實(shí)例詳解

    Java CAS底層實(shí)現(xiàn)原理實(shí)例詳解

    這篇文章主要介紹了Java CAS底層實(shí)現(xiàn)原理實(shí)例詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-01-01
  • java數(shù)據(jù)類型與二進(jìn)制詳細(xì)介紹

    java數(shù)據(jù)類型與二進(jìn)制詳細(xì)介紹

    這篇文章主要介紹了java數(shù)據(jù)類型與二進(jìn)制詳細(xì)介紹的相關(guān)資料,這里對數(shù)據(jù)類型進(jìn)行了一一介紹分析,并說明自動轉(zhuǎn)換和強(qiáng)制轉(zhuǎn)換,需要的朋友可以參考下
    2017-07-07
  • 深入剖析Java之String字符串

    深入剖析Java之String字符串

    這篇文章主要為大家詳細(xì)介紹了Java之String字符串,重新帶大家認(rèn)識String字符串,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-07-07

最新評論

岑溪市| 山阳县| 伊宁县| 梁平县| 石河子市| 辽宁省| 赤水市| 稻城县| 三穗县| 衡南县| 黑水县| 会宁县| 澄江县| 偃师市| 广水市| 茶陵县| 成都市| 宁陵县| 裕民县| 化隆| 西青区| 辽阳县| 二手房| 沾化县| 沧州市| 东源县| 农安县| 逊克县| 鄂伦春自治旗| 阳信县| 那坡县| 岚皋县| 周宁县| 溧阳市| 集贤县| 故城县| 缙云县| 招远市| 黄梅县| 呼伦贝尔市| 大化|