精品欧美一区二区三区在线观看 _久久久久国色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ù)棧公眾號

久蕉在线视频| www.av视频在线观看| 成人久久网站| 国产精品视频线看| 日韩av免费在线看| 国产精品情侣呻吟对白视频| 成人一级视频| 一区二区三区四区精品在线视频| 国产一区二区三区高清| 精品人妻一区二区色欲产成人| 国产区精品区| 欧美一卡二卡三卡| 日本网站免费在线观看| 成人在线观看一区| 国产精品一区二区91| 欧美交受高潮1| 精品人妻一区二区三区蜜桃视频| 91麻豆精品| 精品久久久久久中文字幕大豆网| 亚洲精品高清视频| www.久久久久久| 翔田千里一区二区| 欧美成人在线免费视频| 免费看黄色aaaaaa 片| 亚洲天堂av在线| 国产亚洲成aⅴ人片在线观看| 成人欧美一区二区三区在线湿哒哒 | av中文字幕在线观看| 成人免费毛片嘿嘿连载视频| 国产精品99久久99久久久二8| 日韩在线中文字幕视频| 日韩一级电影| 欧美日韩电影在线| 亚洲乱码日产精品bd在线观看| 欧美日韩伦理片| 国产精品亚洲一区二区三区妖精| 国产精品久久不能| 九九热这里有精品视频| 日韩在线观看| 亚洲精品永久免费| 中文字幕66页| 伊人久久视频| 亚洲sss视频在线视频| 欧美性视频在线播放| 美州a亚洲一视本频v色道| 成人网在线播放| 91久久在线播放| 天天天天天天天干| 免费一区视频| 久久久久久久香蕉网| 69夜色精品国产69乱| 伦理一区二区三区| 精品剧情在线观看| 日韩高清在线一区二区| a屁视频一区二区三区四区| 欧美日韩中文字幕| aa在线观看视频| 精品日韩av| 一区二区三区高清在线| 黄色网址在线免费看| 在线日本中文字幕| 日本一区二区三区在线不卡| 欧美另类视频在线| 黄色片在线看| 久久免费偷拍视频| 免费日韩电影在线观看| 香蕉久久国产av一区二区| 国产91精品一区二区麻豆网站| 成人羞羞国产免费| 999久久久久久| 老色鬼精品视频在线观看播放| 日韩女在线观看| 国产婷婷色一区二区在线观看 | 久久99亚洲热视| 欧美老熟妇一区二区三区| 人人狠狠综合久久亚洲婷婷| 国产一区二区三区日韩欧美| 强迫凌虐淫辱の牝奴在线观看| jazzjazz国产精品麻豆| 精品国产伦一区二区三区观看方式| 亚洲一区二区三区三州| 日韩av综合| 精品国产一区二区三区久久久蜜月| 国产精品日日摸夜夜爽| 久久视频社区| 亚洲第一精品福利| 在线精品一区二区三区| 成人香蕉社区| 国产丝袜精品视频| 亚洲图片另类小说| 欧美成免费一区二区视频| 久久久999国产精品| 黄色一级片在线免费观看| 国产在线成人| 欧美一区深夜视频| 中文无码av一区二区三区| 激情文学综合插| 国产九色91| 欧洲一级在线观看| 中文字幕在线不卡视频| 日韩av中文字幕第一页| 欧美精品总汇| 日韩一级精品视频在线观看| 大桥未久恸哭の女教师| 精品久久成人| 久久777国产线看观看精品| 97超碰人人干| 久久国产精品区| 国产精品v欧美精品v日韩| 九色网友自拍视频手机在线| 综合久久综合久久| 免费看黄色a级片| 91av久久| 欧美日本一道本| 中文在线观看免费视频| 日韩精品一区二区久久| 久久久久国产精品www| 中文字幕精品无| 国产suv精品一区二区三区| 欧美日韩高清免费| 午夜羞羞小视频在线观看| 色综合久久久久网| 色哟哟免费视频| 国产精品嫩草影院在线看| 九九九热精品免费视频观看网站| 精品人妻一区二区三区潮喷在线 | 亚洲欧洲国产视频| 国产一区不卡| 久久久女女女女999久久| 中文字幕自拍偷拍| 久久先锋影音av| 加勒比海盗1在线观看免费国语版| 欧美精品日日操| 日韩美女主播在线视频一区二区三区| 久久成人激情视频| 精品电影一区| 国产精品视频一区二区三区四| 香蕉人妻av久久久久天天| 樱花影视一区二区| 亚洲欧美在线精品| 人人精品亚洲| 97色在线观看免费视频| 国产情侣激情自拍| 亚洲国产精品精华液ab| 久久久久久久久久久福利| www.久久东京| 久久影院在线观看| 黄色在线视频网址| 99久久久久免费精品国产| 欧美极品少妇无套实战| 国产精品1区在线| 正在播放国产一区| 波多野结衣小视频| 久久先锋影音av| 日韩av片在线看| 99re6热只有精品免费观看| 麻豆国产va免费精品高清在线| 免费在线不卡av| 久久精品夜色噜噜亚洲a∨| 91专区在线观看| 久久久久高潮毛片免费全部播放| 欧美丰满少妇xxxxx| 国产成人久久精品77777综合| 国产日韩欧美精品在线| 亚洲色精品三区二区一区| 天海翼精品一区二区三区| 97精品一区二区三区| 黄色小视频免费在线观看| 亚洲精品久久久久久国产精华液| 在线观看视频你懂得| 欧美日韩国产探花| 亚洲xxxx18| 欧美伦理免费在线| 精品成a人在线观看| 亚洲国产精一区二区三区性色| 成人网页在线观看| 亚洲国产精品久久久久婷蜜芽| 久久丝袜视频| 国产精品久久久久久久av大片| 牛牛影视精品影视| 在线观看亚洲一区| 日韩精品123区| 国产成人一区在线| 日本欧美视频在线观看| 国产福利一区二区精品秒拍| 97人人做人人爱| eeuss影院www在线观看| 欧美美女一区二区三区| 免费中文字幕视频| 97精品国产露脸对白| 国产免费视频传媒| 日韩成人a**站| 国产精品自拍偷拍| www视频在线免费观看| 国产丶欧美丶日本不卡视频| 亚洲日本精品| www.欧美| 91精品国产高清久久久久久91| 飘雪影院手机免费高清版在线观看| 色哟哟亚洲精品| 99热在线观看精品| 国产91精品久久久久久久网曝门| 欧美丰满熟妇bbbbbb百度| 男男gay无套免费视频欧美| 国产精品人成电影| 国语对白在线刺激| 一本大道久久加勒比香蕉| 精品国产区一区二| 色综合久久综合中文综合网| 亚洲欧美卡通动漫| 成人国产精品视频| 五月婷婷激情久久| 亚洲高清网站| 一区二区三区国| 欧美日韩一区二区三区在线电影| 国产日韩综合一区二区性色av| 超碰中文在线| 中文字幕日韩在线播放| 亚洲精品成av人片天堂无码| 在线免费不卡电影| 久久婷婷综合国产| 成人网页在线观看| jizz大全欧美jizzcom| 狠狠爱综合网| 一区二区在线观| 天天躁日日躁狠狠躁欧美| 成人激情视频在线| 欧美人体一区二区三区| 久热99视频在线观看| 久青青在线观看视频国产| 欧美成人vps| 一卡二卡三卡在线| 色久优优欧美色久优优| 国产无码精品在线播放| 亚洲色图欧洲色图婷婷| 亚洲一级片在线播放| 99久久综合精品| 人妻巨大乳一二三区| 另类小说综合欧美亚洲| 久久久久狠狠高潮亚洲精品| 亚洲日产国产精品| 欧美一级免费在线观看| 欧美日韩国产高清电影| 女同一区二区| 丝袜连裤袜欧美激情日韩| 国产精品亚洲综合| 精品国产亚洲一区二区在线观看 | 国产天堂素人系列在线视频| 精品国产a毛片| 精品人妻久久久久一区二区三区| 欧美日韩一区二区三区不卡| 精品乱码一区内射人妻无码| 欧美午夜www高清视频| 国产精品免费av一区二区| 亚洲一区二区av电影| 乱h高h女3p含苞待放| 国产精品色婷婷| 免费看日本黄色片| 国产欧美视频一区二区| 中国女人特级毛片| 国产女主播视频一区二区| caopeng视频| 国产亚洲综合在线| 欧美偷拍一区二区三区| 国产亚洲精品aa| 林心如三级全黄裸体| 国产精品久久三| chinese全程对白| 亚洲人成影院在线观看| 美国黄色小视频| 亚洲一区在线播放| 日本高清www免费视频| 欧美日韩激情视频| 精产国品一区二区| 精品国产91久久久| 欧美一区免费看| 欧美视频一区二| 97在线播放免费观看| 欧美一区二区三区视频在线| 亚洲精品一级片| 精品少妇一区二区三区免费观看| 国产91免费在线观看| 亚洲国产精品网站| 国产永久av在线| 久久精品夜夜夜夜夜久久| 免费黄色在线看| 欧美精品激情视频| 成人直播视频| 国产精品久久久久久久久久久久久久 | 成人在线高清视频| 最新的欧美黄色| a级网站在线播放| 久久久久久久久久久成人| 中文字幕21页在线看| 国产日韩中文在线| 一区二区在线视频观看| 老牛影视免费一区二区| 欧美3p在线观看| 欧美大黑帍在线播放| 国产精品一二| 五月婷婷六月丁香激情| 国产精品456| 全黄一级裸体片| 成人免费在线播放视频| 国产成人在线观看免费网站| 性生生活大片免费看视频| gogo大胆日本视频一区| 国产精品久久久免费看| 疯狂做受xxxx高潮欧美日本| 国产剧情久久久| 亚洲人线精品午夜| 国产精品探花在线| 国产一区红桃视频| 女人丝袜激情亚洲| 国产毛片视频网站| 国产一区二区精品在线观看| 欧美福利第一页| 在线观看亚洲网站| 欧美一a一片一级一片| 天堂a中文在线| 欧美激情一区二区久久久| 色999韩欧美国产综合俺来也| 免费在线成人av| 亚洲免费播放| 中文字幕天堂网| 亚洲综合在线第一页| 国产三级三级在线观看| 日韩一区av在线| 素人啪啪色综合| 日韩av一级大片| 视频一区二区三区入口| 黄色a一级视频| 欧美性生交大片免费| 少妇av在线播放| 国内精品久久久久影院优| 在线综合色站| 人妻激情另类乱人伦人妻| 国产精品一区在线| 成年人午夜剧场| 欧美一三区三区四区免费在线看| 最新国产在线观看| 国产日韩欧美视频在线| 大色综合视频网站在线播放| 九九九在线观看视频| 中文子幕无线码一区tr| 曰批又黄又爽免费视频| 中文字幕久久精品| 亚洲精品三区| 400部精品国偷自产在线观看| 国产综合久久久久久鬼色| 日本黄色片免费观看| 欧美一卡2卡3卡4卡| 少女频道在线观看免费播放电视剧| 亚洲综合一区二区不卡| 欧美日韩在线大尺度| 性囗交免费视频观看| 精品久久久久久久久久| 美国一级片在线免费观看视频| 奇米成人av国产一区二区三区| 亚洲人挤奶视频| 欧美三级理论片| 日韩美女视频一区二区| 囯产精品一品二区三区| 欧美一级电影在线| 欧美在线电影| 国内精品国产三级国产aⅴ久| 亚洲一区二区av在线| 日本一区视频| 国产日韩精品一区二区| 欧美精品18| 右手影院亚洲欧美| 欧美三级资源在线| 欧美黑人xx片| 久久久久久久有限公司| 美女视频第一区二区三区免费观看网站| 欧美激情图片小说| 亚洲国产日韩欧美在线图片| 成人免费福利| www.69av| 国产亚洲美州欧州综合国| 国产精品乱码一区二区| 97精品国产91久久久久久| 色无极亚洲影院| youjizz.com日本| 欧美性猛片aaaaaaa做受| 色老头在线观看| 日韩不卡av| 国产成人免费在线| 无码人妻精品一区二区三区蜜桃91| 日韩在线视频播放| 欧美亚洲国产日韩| 国产又黄又猛的视频| 高潮白浆女日韩av免费看| 欧美另类极品| 欧美日韩国产一二| 国产99久久久久久免费看农村| 国产视频1区2区| 欧美另类在线播放| 成人免费看片39| 搡老熟女老女人一区二区|