精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Spring Boot 如何快速過濾出一次請求的所有日志?

開發(fā) 開發(fā)工具
本文講述了如何使用MDC工具來快速過濾一次請求的所有日志,并通過裝飾器模式使得MDC工具在異步線程里也能生效。

出現(xiàn)故障時(shí),我們經(jīng)常需要獲取一次請求流程里的所有日志進(jìn)行定位。

如果請求只在一個(gè)線程里處理,則我們可以通過線程ID來過濾日志,但如果請求包含異步線程的處理,那么光靠線程ID就顯得捉襟見肘了。

華為IoT平臺,提供了接收設(shè)備上報(bào)數(shù)據(jù)的能力, 當(dāng)數(shù)據(jù)到達(dá)平臺后,平臺會進(jìn)行一些復(fù)雜的業(yè)務(wù)邏輯處理,如數(shù)據(jù)存儲,規(guī)則引擎,數(shù)據(jù)推送,命令下發(fā)等等。由于這個(gè)邏輯之間沒有強(qiáng)耦合的關(guān)系,所以通常是異步處理。如何將一次數(shù)據(jù)上報(bào)請求中包含的所有業(yè)務(wù)日志快速過濾出來,就是本文要介紹的。

1、正文

SLF4J日志框架提供了一個(gè)MDC(Mapped Diagnostic Contexts)工具類,谷歌翻譯為映射的診斷上下文 ,從字面上很難理解,我們可以先實(shí)戰(zhàn)一把。

public class Main {

private static final String KEY = "requestId";
private static final Logger logger = LoggerFactory.getLogger(Main.class);

public static void main(String[] args){

// 入口傳入請求ID
MDC.put(KEY, UUID.randomUUID().toString());

// 打印日志
logger.debug("log in main thread 1");
logger.debug("log in main thread 2");
logger.debug("log in main thread 3");

// 出口移除請求ID
MDC.remove(KEY);

}

}

我們在main函數(shù)的入口調(diào)用MDC.put()?方法傳入請求ID,在出口調(diào)用MDC.remove()方法移除請求ID。配置好log4j2.xml 文件后,運(yùn)行main函數(shù),可以在控制臺看到以下日志輸出:

2018-02-17 13:19:52.606 {requestId=f97ea0fb-2a43-40f4-a3e8-711f776857d0} [main] DEBUG cn.wudashan.Main - log in main thread 1
2018-02-17 13:19:52.609 {requestId=f97ea0fb-2a43-40f4-a3e8-711f776857d0} [main] DEBUG cn.wudashan.Main - log in main thread 2
2018-02-17 13:19:52.609 {requestId=f97ea0fb-2a43-40f4-a3e8-711f776857d0} [main] DEBUG cn.wudashan.Main - log in main thread 3

從日志中可以明顯地看到花括號中包含了 (映射的)請求ID(requestId),這其實(shí)就是我們定位(診斷)問題的關(guān)鍵字(上下文) 。有了MDC工具,只要在接口或切面植入put()和remove()?代碼,在現(xiàn)網(wǎng)定位問題時(shí),我們就可以通過grep requestId=xxx *.log快速的過濾出某次請求的所有日志。

2、進(jìn)階

然而,MDC工具真的有我們所想的這么方便嗎?回到我們開頭,一次請求可能涉及多線程異步處理,那么在多線程異步的場景下,它是否還能正常運(yùn)作呢?Talk is cheap, show me the code。

public class Main {

private static final String KEY = "requestId";
private static final Logger logger = LoggerFactory.getLogger(Main.class);

public static void main(String[] args){

// 入口傳入請求ID
MDC.put(KEY, UUID.randomUUID().toString());

// 主線程打印<font style="color: #1e6bb8;word-wrap: break-word;font-weight: bold;border-bottom: 1px solid">日志</font>
logger.debug("log in main thread");

// 異步線程打印<font style="color: #1e6bb8;word-wrap: break-word;font-weight: bold;border-bottom: 1px solid">日志</font>
new Thread(new Runnable() {
@Override
public void run(){
logger.debug("log in other thread");
}
}).start();

// 出口移除請求ID
MDC.remove(KEY);

}

}

代碼里我們新起了一個(gè)異步線程,并在匿名對象Runnable的run()方法打印日志。運(yùn)行main函數(shù),可以在控制臺看到以下日志輸出:

2018-02-17 14:05:43.487 {requestId=e6099c85-72be-4986-8a28-de6bb2e52b01} [main] DEBUG cn.wudashan.Main - log in main thread
2018-02-17 14:05:43.490 {} [Thread-1] DEBUG cn.wudashan.Main - log in other thread

不幸的是,請求ID在異步線程里不打印了。這是怎么回事呢?

要解決這個(gè)問題,我們就得知道MDC的實(shí)現(xiàn)原理。由于篇幅有限,這里就暫不詳細(xì)介紹,MDC之所以在異步線程中不生效是因?yàn)榈讓硬捎肨hreadLocal 作為數(shù)據(jù)結(jié)構(gòu),我們調(diào)用MDC.put()方法傳入的請求ID只在當(dāng)前線程有效。

感興趣的小伙伴可以自己深入一下代碼細(xì)節(jié)。

知道了原理那么解決這個(gè)問題就輕而易舉了,我們可以使用裝飾器模式 ,新寫一個(gè)MDCRunnable類對Runnable接口進(jìn)行一層裝飾。

在創(chuàng)建MDCRunnable類?時(shí)保存當(dāng)前線程的MDC值,在執(zhí)行run()方法時(shí)再將保存的MDC值拷貝到異步線程中去。

代碼實(shí)現(xiàn)如下:

public class MDCRunnable implements Runnable {

private final Runnable runnable;

private final Map<String, String> map;

public MDCRunnable(Runnable runnable){
this.runnable = runnable;
// 保存當(dāng)前線程的MDC值
this.map = MDC.getCopyOfContextMap();
}

@Override
public void run(){
// 傳入已保存的MDC值
for (Map.Entry<String, String> entry : map.entrySet()) {
MDC.put(entry.getKey(), entry.getValue());
}
// 裝飾器模式,執(zhí)行run方法
runnable.run();
// 移除已保存的MDC值
for (Map.Entry<String, String> entry : map.entrySet()) {
MDC.remove(entry.getKey());
}
}

}

接著,我們需要對main函數(shù)里創(chuàng)建的Runnable實(shí)現(xiàn)類進(jìn)行裝飾:

public class Main {

private static final String KEY = "requestId";
private static final Logger logger = LoggerFactory.getLogger(Main.class);
private static final ExecutorService EXECUTOR = Executors.newSingleThreadExecutor();

public static void main(String[] args){

// 入口傳入請求ID
MDC.put(KEY, UUID.randomUUID().toString());

// 主線程打印日志
logger.debug("log in main thread");

// 異步線程打印日志,用MDCRunnable裝飾Runnable
new Thread(new MDCRunnable(new Runnable() {
@Override
public void run(){
logger.debug("log in other thread");
}
})).start();

// 異步線程池打印日志,用MDCRunnable裝飾Runnable
EXECUTOR.execute(new MDCRunnable(new Runnable() {
@Override
public void run(){
logger.debug("log in other thread pool");
}
}));
EXECUTOR.shutdown();

// 出口移除請求ID
MDC.remove(KEY);

}

}

執(zhí)行main函數(shù),將會輸出以下日志:

2018-03-04 23:44:05.343 {requestId=5ee2a117-e090-41d8-977b-cef5dea09d34} [main] DEBUG cn.wudashan.Main - log in main thread
2018-03-04 23:44:05.346 {requestId=5ee2a117-e090-41d8-977b-cef5dea09d34} [Thread-1] DEBUG cn.wudashan.Main - log in other thread
2018-03-04 23:44:05.347 {requestId=5ee2a117-e090-41d8-977b-cef5dea09d34} [pool-2-thread-1] DEBUG cn.wudashan.Main - log in other thread pool

Congratulations! 經(jīng)過我們的努力,最終在異步線程和線程池中都有requestId打印了!

3、總結(jié)

本文講述了如何使用MDC工具來快速過濾一次請求的所有日志,并通過裝飾器模式使得MDC工具在異步線程里也能生效。

有了MDC,再通過AOP技術(shù)對所有的切面植入requestId,就可以將整個(gè)系統(tǒng)的任意流程的日志過濾出來。

使用MDC工具,在開發(fā)自測階段,可以極大地節(jié)省定位問題的時(shí)間,提升開發(fā)效率;在運(yùn)維維護(hù)階段,可以快速地收集相關(guān)日志信息,加快分析速度。

責(zé)任編輯:武曉燕 來源: 碼猿技術(shù)專欄
相關(guān)推薦

2021-11-26 14:45:16

日志Java代碼

2023-11-02 18:01:24

SpringMVC配置

2020-10-10 08:49:02

JS

2020-10-10 08:01:38

JS HTML 表單

2020-07-14 11:00:12

Spring BootRedisJava

2021-08-11 05:00:48

Spring 日志手段

2024-05-14 08:08:38

SpringSPIjava

2024-10-10 10:32:04

2019-04-15 08:32:25

Spring Boot日志門面模式

2019-12-27 10:24:43

瀏覽器底層DNS

2020-08-24 07:34:39

網(wǎng)絡(luò)超時(shí)請求

2020-09-02 17:28:26

Spring Boot Redis集成

2023-02-26 10:14:51

Spring第三方庫

2024-02-28 08:18:13

Java日志項(xiàng)目

2023-02-26 00:00:01

Spring數(shù)據(jù)庫組件

2011-06-28 10:41:50

DBA

2022-05-12 09:52:09

網(wǎng)絡(luò)架構(gòu)HTTP跨域保護(hù)機(jī)制

2023-09-19 22:41:30

控制器HTTP

2024-01-16 08:17:29

Mybatis驗(yàn)證業(yè)務(wù)

2023-12-29 18:13:27

Spring日志應(yīng)用程序
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號

亚洲bt欧美bt日本bt| 亚洲人成啪啪网站| 99久re热视频精品98| 国产永久免费视频| 欧美国产综合| 亚洲国产一区二区三区四区| 国产肥臀一区二区福利视频| 黄色影院在线播放| 蜜臀久久久久久久| 免费不卡欧美自拍视频| 不许穿内裤随时挨c调教h苏绵 | 69174成人网| 国产小视频在线观看免费| 偷拍自拍亚洲色图| 欧美日韩国产小视频在线观看| 亚洲视频导航| 亚洲精品喷潮一区二区三区| 国产乱码精品| 精品国产拍在线观看| youjizz.com国产| 国模视频一区| 亚洲一级二级三级| 欧美系列一区| 国产999久久久| 视频一区二区三区入口| 欧美激情精品久久久| 免费看91的网站| 国产在线播放精品| 9191精品国产综合久久久久久| 日韩久久久久久久久久久久| 国产视频福利在线| av一本久道久久综合久久鬼色| 国产精品视频在线观看| 日韩欧美视频在线免费观看| 天天色天天射综合网| 亚洲理论在线a中文字幕| 无套白嫩进入乌克兰美女| 性欧美1819sex性高清| 亚洲亚洲精品在线观看| 国产a级片免费看| 国内在线精品| 91在线视频免费观看| 91精品久久久久久蜜桃| 在线免费观看高清视频| 欧美一级播放| 97人人做人人爱| 国产亚洲精品成人| 欧美女人交a| 久久亚洲春色中文字幕| 久久久久无码精品国产sm果冻| 日韩成人视屏| 4438成人网| xx欧美撒尿嘘撒尿xx| 国产日韩另类视频一区| 欧美日韩一区二区免费在线观看 | 欧洲乱码伦视频免费| 日韩av一区二区在线观看| 欧美成人精品一区二区综合免费| 第四色男人最爱上成人网| 欧美日韩在线视频一区| 青青草国产精品视频| 黄网在线免费看| 亚洲自拍偷拍网站| 九九热只有这里有精品| 97蜜桃久久| 亚洲va韩国va欧美va精品| 18黄暴禁片在线观看| 黄网页在线观看| 亚洲欧美偷拍三级| 欧美精品久久96人妻无码| 黄网站免费在线播放| 亚洲美女视频一区| 福利在线一区二区| sm在线播放| 欧美视频免费在线| 欧美日韩一区二区在线免费观看| 精品极品在线| 欧美日韩中文在线| 97在线播放视频| 午夜欧美巨大性欧美巨大| 欧美伊人久久久久久久久影院| 毛片av免费在线观看| 福利精品一区| 欧美一区二区精品久久911| 无套内谢丰满少妇中文字幕| 香蕉免费一区二区三区在线观看 | 国产手机精品视频| 国产毛片精品国产一区二区三区| 国产精品亚洲精品| 999免费视频| 国产成人av影院| 精品国产乱码久久久久久久软件| 少妇av在线播放| 久久综合资源网| 亚洲成人自拍视频| 草莓福利社区在线| 天天色综合成人网| 国产又黄又猛又粗又爽的视频| 久久伊人国产| 精品乱人伦小说| 免费在线观看成年人视频| 不卡在线一区二区| 欧美高跟鞋交xxxxxhd| 中文字幕视频网| 黑人巨大精品欧美一区| 国产亚洲一区二区三区在线播放| 青青草免费在线视频| 亚洲视频每日更新| av免费中文字幕| 精品一区91| 亚洲人精品午夜在线观看| 性欧美疯狂猛交69hd| 亚洲免费婷婷| 亚洲www在线观看| 国产综合在线观看| 亚洲成人手机在线| 日本国产一级片| 日韩有码av| 欧美成人精品一区二区| 无码人妻精品一区二| 成人一区在线观看| 亚洲午夜在线观看| 不卡av播放| 欧美va亚洲va在线观看蝴蝶网| 欧美性xxxx图片| 一区二区国产在线| 国产裸体写真av一区二区 | 欧美日韩你懂得| 香港三级日本三级| 欧美一区影院| 国产精品一区二区三区久久| 艳母动漫在线看| 一区二区三区美女视频| 欧美丝袜在线观看| 欧美色就是色| 欧美一区在线直播| 男人天堂av网| 一区二区三区免费看视频| 色91精品久久久久久久久| 国产欧美日韩免费观看| 欧美一区二区.| 日韩在线观看视频一区| 一区二区理论电影在线观看| 看看黄色一级片| 色爱综合网欧美| 国产精品igao视频| 日韩毛片在线一区二区毛片| 亚洲国产成人av| 欧美一级片在线免费观看| 91精品动漫在线观看| 国产在线日韩在线| 日本在线免费网| 欧美网站一区二区| 51妺嘿嘿午夜福利| 日韩在线一区二区三区| 欧美日韩国产综合在线| 成人免费网站视频| 亚洲天堂男人天堂| 蜜臀精品一区二区三区| 久久久综合网站| 成人免费无码av| 免费久久久久久久久| 日韩美女主播视频| 二区三区在线播放| 欧美日韩不卡一区| 国产67194| 丰满放荡岳乱妇91ww| 喜爱夜蒲2在线| 日韩中文字幕在线一区 | 在线电影福利片| 欧美一级国产精品| 中文在线观看免费网站| 久久看人人爽人人| 亚洲精品手机在线观看| 中文字幕一区二区三区在线视频| 成人a在线观看| 97超碰在线公开在线看免费| 精品捆绑美女sm三区| 日本一级一片免费视频| 久久久久久日产精品| av网站在线不卡| 希岛爱理av一区二区三区| 97se国产在线视频| 不卡av影片| 精品国内亚洲在观看18黄| 精品人妻无码一区二区色欲产成人 | 国产日韩欧美一区| 国产欧美亚洲日本| 欧美日韩电影免费看| 最新91在线视频| 亚洲av无码一区二区三区性色 | 欧美xxxxhdvideosex| 亚洲第一精品夜夜躁人人躁| 免费黄色网址在线| 中文字幕日韩精品一区| 国产精九九网站漫画| 免费日韩av片| 中文字幕一区二区中文字幕| 盗摄系列偷拍视频精品tp| 日本亚洲欧美成人| 97超碰资源站在线观看| 国产午夜精品麻豆| 国产成人久久精品77777综合 | 亚洲成人精品av| 国产亚洲欧美另类一区二区三区| 女同视频在线观看| 亚洲欧美成人网| 精品国产九九九| 色欧美乱欧美15图片| 97成人资源站| 国产午夜精品理论片a级大结局| 伊人影院综合在线| 国产日韩欧美一区二区三区在线观看| 久久riav二区三区| 蜜桃精品视频| 国产精品pans私拍| 99在线视频影院| 日韩午夜在线视频| 免费人成黄页在线观看忧物| 日韩欧美色电影| 在线观看毛片视频| 欧美性猛交xxxx| 久青草视频在线观看| 成人欧美一区二区三区小说 | 另类的小说在线视频另类成人小视频在线| 亚洲一区二区三区午夜| 日韩大胆成人| 俄罗斯精品一区二区三区| 国产精品久久久久久久久久齐齐| 欧美国产日本在线| 在线观看免费版| 亚洲欧美综合精品久久成人| 欧美一级淫片aaaaaa| 91麻豆精品国产91久久久久久久久 | 久久久久久久久久97| 2020国产精品自拍| 亚洲自拍偷拍精品| 丁香五精品蜜臀久久久久99网站| 精品www久久久久奶水| 99国产精品视频免费观看一公开| 国产对白在线播放| 99精品视频在线观看免费播放| 蜜桃精品久久久久久久免费影院| 91久久精品无嫩草影院| 亚洲一区二区三区视频| 日韩综合av| 国产一区二区在线免费视频| 国产精品久久久久久久久免费高清 | 中文人妻熟女乱又乱精品| 日韩欧美精品中文字幕| 亚洲影院在线播放| 日韩欧美精品网站| 男操女视频网站| 欧洲日韩一区二区三区| 国产真人无遮挡作爱免费视频| 亚洲h在线观看| 日韩xxx高潮hd| 黄色一区二区在线观看| 日本中文字幕在线免费观看| 午夜伦理一区二区| 国产99久久久| 日本韩国视频一区二区| 中文字幕一二区| 欧美日韩国产经典色站一区二区三区 | 国产av第一区| 综合激情一区| 欧美成人精品免费| 99精品国产在热久久婷婷| 97超碰在线人人| 国产视频亚洲| 人妻无码视频一区二区三区| 美女网站在线免费欧美精品| 中文字幕日韩久久| 成人精品gif动图一区| 久久精品国产亚洲av麻豆| 久久亚洲二区三区| 国产一二三四视频| 亚洲一区二区五区| 久久久久久在线观看| 欧美日韩国产一级片| 午夜久久久久久久久久| 日韩电视剧免费观看网站| 国产www.大片在线| 欧美成年人视频网站| 国产精选在线| 国产精品黄色影片导航在线观看| 国产第一精品| 97久草视频| 嫩草影视亚洲| 中国 免费 av| 一区二区黄色| 日本黄色的视频| 国产成人8x视频一区二区| 美国黄色a级片| 亚洲视频中文字幕| 天天操天天摸天天干| 欧美群妇大交群中文字幕| 欧美特级特黄aaaaaa在线看| 亚洲人成在线播放| 国产黄色大片在线观看| 国产精品九九九| aiss精品大尺度系列| 天堂资源在线亚洲资源| 在线看片欧美| 国产原创精品在线| 99精品欧美一区二区三区综合在线| 日韩人妻无码精品综合区| 亚洲精品videosex极品| 亚洲精品xxxx| av在线免费观看网| 久久久伊人欧美| 欧美视频精品| 久久天天狠狠| 欧美激情1区2区| 五月婷婷激情久久| 99麻豆久久久国产精品免费| 色老板免费视频| 91福利视频网站| 婷婷视频在线观看| 欧美另类高清videos| 日韩和的一区二在线| 国产在线播放一区二区| 欧美激情麻豆| www.色就是色.com| 欧美高清在线一区| 伦av综合一区| 亚洲精品不卡在线| 欧美黑人xx片| 亚洲a区在线视频| 日韩精品免费一区二区三区| 国产中文字幕视频在线观看| 国产成人免费视频网站高清观看视频 | 亚洲怡红院在线| 久久精品一区四区| 91视频免费网址| 精品久久久久香蕉网| 欧美另类极品| 国产美女主播一区| 国内精品久久久久久久影视简单| 91动漫在线看| 国产a区久久久| 欧美成人片在线观看| 制服丝袜中文字幕一区| 免费黄色在线看| 国产美女搞久久| 日韩精品2区| 亚洲最大综合网| 国产欧美一二三区| 中文字幕 人妻熟女| 在线播放国产一区中文字幕剧情欧美| 波多野结依一区| 国产日韩欧美二区| 亚洲免费成人| 国产极品一区二区| 婷婷久久综合九色综合绿巨人 | 国产精品一区二区三区在线| 国产精品大片免费观看| 超碰caoprom| 欧美日韩一区免费| 国产在线视频网| 欧洲精品毛片网站| 久久91麻豆精品一区| 91淫黄看大片| 国产精品国产成人国产三级| 国产免费久久久| 欧美激情手机在线视频 | 国产一二三区在线观看| 91九色国产在线| 欧美日韩影院| 国产极品一区二区| 色婷婷久久一区二区三区麻豆| 欧美日韩免费做爰大片| 国产精品偷伦免费视频观看的| 波多野结衣一区| 天天操夜夜操很很操| 一个色在线综合| 视频国产在线观看| 国产精品视频yy9099| 久久久久久久久久久妇女| 亚洲午夜精品在线观看| 午夜一区二区三区视频| 男男激情在线| 国产视频福利一区| 欧美全黄视频| 一本色道综合久久欧美日韩精品| 欧美午夜片欧美片在线观看| jizz在线观看| 99久久精品久久久久久ai换脸| 亚洲精品激情| 蜜乳av中文字幕| 欧美一区二区三区日韩| 中老年在线免费视频| 亚洲一区二区高清视频| 国产999精品久久久久久| 欧美激情黑白配| 久久视频在线播放| 亚洲警察之高压线| 亚欧美一区二区三区| 色哟哟一区二区三区| www.久久ai|