詳解如何為SpringBoot Web應(yīng)用的日志方便追蹤
前言
在 Web 應(yīng)用程序領(lǐng)域,有效的請(qǐng)求監(jiān)控和可追溯性對(duì)于維護(hù)系統(tǒng)完整性和診斷問(wèn)題至關(guān)重要。Spring Boot 是一種用于構(gòu)建 Java 應(yīng)用程序的流行框架,它提供了強(qiáng)大的日志記錄功能,可以通過(guò)為每個(gè)傳入請(qǐng)求合并唯一標(biāo)識(shí)符來(lái)進(jìn)一步豐富這些功能。這種簡(jiǎn)潔而強(qiáng)大的實(shí)踐使開(kāi)發(fā)人員能夠跟蹤和分析單個(gè)請(qǐng)求流,從而簡(jiǎn)化調(diào)試并增強(qiáng)整體系統(tǒng)的可靠性。在本文中,我們探討了在 Spring Boot 中向日志添加唯一 ID 的重要性,深入了解其實(shí)現(xiàn)以及它為應(yīng)用程序開(kāi)發(fā)和維護(hù)帶來(lái)的眾多好處。
問(wèn)題
如今,我們通常為每項(xiàng)服務(wù)配備多個(gè)服務(wù)器?,F(xiàn)在有兩種檢查日志的方法,第一種是進(jìn)入單個(gè)服務(wù)器實(shí)例并檢查日志。還有另一種方法可以從所有服務(wù)器收集日志,并且可以在一個(gè)地方查看它們。人們通常使用第二種方法來(lái)搜索和分析日志。現(xiàn)在,單個(gè)服務(wù)的多個(gè)服務(wù)器有如此多的日志,跟蹤日志變得很困難。
此外,即使我們有一個(gè)服務(wù)的單個(gè)服務(wù)器,由于并發(fā)請(qǐng)求/線程,也會(huì)打印許多日志。面臨的一個(gè)主要問(wèn)題是跟蹤,因?yàn)槿罩疽越诲e(cuò)方式打印。跟蹤打印的日志變得非常困難。
解決方案
為了解決上述問(wèn)題,我們需要某種與每個(gè)日志條目關(guān)聯(lián)的標(biāo)識(shí)符。我們可以生成一個(gè)唯一的 ID,然后將該 ID 分配給特定請(qǐng)求的所有日志。因此,為特定請(qǐng)求生成的所有日志都將具有唯一的 ID。借助這個(gè)ID,我們可以輕松地通過(guò)日志進(jìn)行追蹤。我們可以在日志中搜索這個(gè)ID并獲取特定請(qǐng)求的所有日志。為了在 Spring Boot 中實(shí)現(xiàn)這一點(diǎn),我們可以使用 AOP。
面向方面編程(AOP)是一種編程范式,允許開(kāi)發(fā)人員將橫切關(guān)注點(diǎn)(例如日志記錄、安全性和事務(wù)管理)模塊化,與核心業(yè)務(wù)邏輯分開(kāi),從而提高代碼的可重用性和可維護(hù)性。它通過(guò)引入“方面”來(lái)實(shí)現(xiàn)這一點(diǎn),這些“方面”可以應(yīng)用于代碼庫(kù)的不同部分,而無(wú)需更改原始代碼。
首先,您必須創(chuàng)建一個(gè)如下所示的請(qǐng)求過(guò)濾器。
/**
* 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;
}
}
上述代碼針對(duì)每個(gè) API 請(qǐng)求運(yùn)行一次,并將相同的唯一 ID 添加到為特定請(qǐng)求生成的所有日志中。接下來(lái),您必須將上述 AOP 過(guò)濾器注冊(cè)為 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è)請(qǐng)求在日志中實(shí)現(xiàn)唯一的 ID 可以通過(guò)關(guān)聯(lián)應(yīng)用程序不同組件之間的日志來(lái)實(shí)現(xiàn)更好的可跟蹤性和調(diào)試,特別是在并發(fā)場(chǎng)景中。這個(gè)唯一的標(biāo)識(shí)符有助于跟蹤請(qǐng)求流、識(shí)別潛在問(wèn)題并提高整體系統(tǒng)的可觀察性。
以上就是詳解如何為Spring Boot Web應(yīng)用的日志方便追蹤的詳細(xì)內(nèi)容,更多關(guān)于Spring Boot Web日志追蹤的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- springboot整合dubbo設(shè)置全局唯一ID進(jìn)行日志追蹤的示例代碼
- SpringBoot項(xiàng)目實(shí)現(xiàn)分布式日志鏈路追蹤
- SpringBoot實(shí)現(xiàn)簡(jiǎn)單的日志鏈路追蹤
- SpringBoot實(shí)現(xiàn)日志鏈路追蹤的項(xiàng)目實(shí)踐
- Springboot MDC+logback實(shí)現(xiàn)日志追蹤的方法
- SpringBoot使用TraceId進(jìn)行日志鏈路追蹤的實(shí)現(xiàn)步驟
- SpringBoot使用TraceId進(jìn)行日志追蹤的實(shí)現(xiàn)
相關(guān)文章
SpringBoot對(duì)Druid配置SQL監(jiān)控功能失效問(wèn)題及解決方法
這篇文章主要介紹了SpringBoot對(duì)Druid配置SQL監(jiān)控功能失效問(wèn)題的解決方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-05-05
Java利用TCP實(shí)現(xiàn)服務(wù)端向客戶端消息群發(fā)的示例代碼
這篇文章主要為大家詳細(xì)介紹了Java如何利用TCP協(xié)議實(shí)現(xiàn)服務(wù)端向客戶端消息群發(fā)功能,文中的示例代碼講解詳細(xì),需要的可以參考下,希望對(duì)你有所幫助2022-08-08
Java中ArrayList去除重復(fù)元素(包括字符串和自定義對(duì)象)
本文主要介紹了Java中ArrayList去除重復(fù)元素(包括字符串和自定義對(duì)象)的方法。具有很好的參考價(jià)值。下面跟著小編一起來(lái)看下吧2017-03-03
在IntelliJ IDEA中創(chuàng)建和運(yùn)行java/scala/spark程序的方法
這篇文章主要介紹了在IntelliJ IDEA中創(chuàng)建和運(yùn)行java/scala/spark程序的教程,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-05-05
spring boot項(xiàng)目快速構(gòu)建的全步驟
這篇文章主要給大家介紹了關(guān)于spring boot項(xiàng)目快速構(gòu)建的全步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用spring boot具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09
JavaCV調(diào)用百度AI實(shí)現(xiàn)人臉檢測(cè)方法詳解
在檢測(cè)人臉數(shù)量、位置、性別、口罩等場(chǎng)景時(shí),可以考慮使用百度開(kāi)放平臺(tái)提供的web接口,一個(gè)web請(qǐng)求就能完成檢測(cè)得到結(jié)果。本文就為大家介紹JavaCV如何調(diào)用百度AI實(shí)現(xiàn)最簡(jiǎn)單的人臉檢測(cè),需要的可以參考一下2022-01-01
Java連接FTP服務(wù)器并使用ftp連接池進(jìn)行文件操作指南
使用FTP最主要的功能是對(duì)文件進(jìn)行管理,下面這篇文章主要給大家介紹了關(guān)于Java連接FTP服務(wù)器并使用ftp連接池進(jìn)行文件操作的相關(guān)資料,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-08-08

