【java日志設(shè)計(jì)】使日志體現(xiàn)出處理流程(log classification)

? 在我們編寫(xiě)程序的時(shí)候癞松,日志是必不可少的峦嗤,但是在并發(fā)較大或者涉及多線程的系統(tǒng)中院水,每個(gè)用戶的請(qǐng)求所產(chǎn)生的日志交差打印腊徙,也會(huì)導(dǎo)致日志顯示的混亂(如圖1 普通日志)简十,因此將每個(gè)日志標(biāo)志為分類成一個(gè)用戶訪問(wèn)所導(dǎo)致的日志是有一定合理性的(如圖2 日志歸類)。其實(shí)我們通過(guò)圖一和圖二就可以看出差別撬腾,我們可以通過(guò)錯(cuò)誤打印的唯一標(biāo)識(shí)符追蹤之前的處理過(guò)程以及參數(shù)螟蝙。怎么讓每個(gè)請(qǐng)求的日志標(biāo)志成一個(gè)呢?下文將圍繞一個(gè)用戶注冊(cè)實(shí)例的web應(yīng)用民傻,說(shuō)明如何便利生成唯一標(biāo)識(shí)符并在每個(gè)日志中展現(xiàn)出來(lái)的樣例胰默。

圖1 普通日志
圖2 日志歸類圖



? ? 在這里做一個(gè)場(chǎng)景,我們?cè)谟脩暨M(jìn)行注冊(cè)帳號(hào)密碼的時(shí)候漓踢,后臺(tái)將這條記錄插入到數(shù)據(jù)庫(kù)中牵署,并開(kāi)啟一個(gè)線程發(fā)送郵件給對(duì)方的郵箱處,發(fā)送的郵件中默認(rèn)密碼是大于8位的喧半,前后兩位不作處理奴迅,中間做去敏操作(打*號(hào))。

一挺据、方法一(不推薦)

? ? 這是最為簡(jiǎn)單的方法取具,在一個(gè)請(qǐng)求產(chǎn)生的時(shí)候,我們生成一個(gè)唯一標(biāo)識(shí)符作為loggerID扁耐,然后一傳到底暇检,并在打印的時(shí)候,將loggerID打印出來(lái)婉称。具體的我們將以代碼展現(xiàn)块仆。

啟動(dòng)的main函數(shù):

圖3 方法一的Main函數(shù)
圖4 方法一的dao
圖5 方法一的controller


圖6 方法一發(fā)郵件的線程
圖7 方法一效果圖

? 總結(jié):雖然可以滿足需求,可以將所有日志歸類為一個(gè)用戶的請(qǐng)求產(chǎn)生的酿矢,但是過(guò)于耦合與繁雜榨乎,需要我們每次都將loggerID當(dāng)作參數(shù)一傳到底。這么繁瑣的方法瘫筐,而且還有一個(gè)問(wèn)題,當(dāng)exception打印出來(lái)的時(shí)候铐姚,并不會(huì)有l(wèi)oggerID出現(xiàn)策肝。

? 方法一有那么多的缺點(diǎn),這當(dāng)然不是我們這個(gè)博文所推薦了的隐绵,以下我們將介紹一個(gè)解耦并且不繁瑣的方式解決這個(gè)問(wèn)題之众。

二、方法二(推薦)

? 在此方法中依许,我們?nèi)匀皇褂玫氖荢pring Boot棺禾,logback與slf4j,之間我們會(huì)運(yùn)用到filter與aop峭跳。具體的做法是膘婶,制作一個(gè)Filter缺前,在每一個(gè)請(qǐng)求產(chǎn)生的時(shí)候,dispatcherServlet派發(fā)之前悬襟,生成一個(gè)唯一標(biāo)識(shí)符作為loggerID衅码,然后保存在MDC下和InheritableThreadLocal下,并在新產(chǎn)生的線程脊岳,在構(gòu)造這個(gè)這個(gè)線程對(duì)象的時(shí)候從InheritableThreadLocal獲取loggerID并將至保存在MDC下逝段。在打印的框架下配置相應(yīng)的打印格式,即可割捅。no bb奶躯,let me show code。

圖7 方法二的logback配置文件
圖8 存loggerID的專屬InheritableThreadLocal
圖9 方法二的main函數(shù)
圖10 方法二的filter(作用:生成loggerID亿驾,保存mdc與InheritableThreadLocal中)



圖11 方法二的async
圖12 方法二的controller
圖13 方法二的aop代碼
圖14 方法二生成的日志

總結(jié):首先巫糙,需要寫(xiě)個(gè)filter,生成loggerID颊乘,保存到mdc與InheritableThreadLocal中参淹;第二,在新開(kāi)啟的線程寫(xiě)上aop(或者其他方式)乏悄,從父線程中獲取loggerID浙值,并保存到MDC中;第三檩小,在logback配置打印到mdc保存的loggerID开呐。這個(gè)方法前期工作需要設(shè)計(jì)好,后續(xù)不用不斷傳輸loggerID规求,成功解耦筐付,也不需要打印的時(shí)候?qū)oggerID顯示寫(xiě)上去了。


說(shuō)明:

1.代碼將會(huì)放到github上阻肿,我將普通打印日志瓦戚、方法一與方法二都放在了同一個(gè)項(xiàng)目,并將他們歸類為不同的包丛塌,person.caspar.commonlogger是沒(méi)有l(wèi)oggerID標(biāo)志的普通項(xiàng)目的實(shí)現(xiàn)较解;person.caspar.mdclogger是方法二的實(shí)現(xiàn);person.caspar.method1是方法一的實(shí)現(xiàn)赴邻。

2.在代碼中我將發(fā)送郵件直接放到了dao中印衔,由于時(shí)間關(guān)系我就懶得抽包,大家不要介意姥敛。

3.該博文的代碼:https://github.com/casparhuan/generateloggerid

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末奸焙,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌与帆,老刑警劉巖了赌,帶你破解...
    沈念sama閱讀 217,734評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異鲤桥,居然都是意外死亡揍拆,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門(mén)茶凳,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)嫂拴,“玉大人,你說(shuō)我怎么就攤上這事贮喧⊥埠荩” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,133評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵箱沦,是天一觀的道長(zhǎng)辩恼。 經(jīng)常有香客問(wèn)我,道長(zhǎng)谓形,這世上最難降的妖魔是什么灶伊? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,532評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮寒跳,結(jié)果婚禮上聘萨,老公的妹妹穿的比我還像新娘。我一直安慰自己童太,他們只是感情好米辐,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,585評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著书释,像睡著了一般翘贮。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上爆惧,一...
    開(kāi)封第一講書(shū)人閱讀 51,462評(píng)論 1 302
  • 那天狸页,我揣著相機(jī)與錄音,去河邊找鬼检激。 笑死肴捉,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的叔收。 我是一名探鬼主播,決...
    沈念sama閱讀 40,262評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼傲隶,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼饺律!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起跺株,我...
    開(kāi)封第一講書(shū)人閱讀 39,153評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤复濒,失蹤者是張志新(化名)和其女友劉穎脖卖,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體巧颈,經(jīng)...
    沈念sama閱讀 45,587評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡畦木,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,792評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了砸泛。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片十籍。...
    茶點(diǎn)故事閱讀 39,919評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖唇礁,靈堂內(nèi)的尸體忽然破棺而出勾栗,到底是詐尸還是另有隱情,我是刑警寧澤盏筐,帶...
    沈念sama閱讀 35,635評(píng)論 5 345
  • 正文 年R本政府宣布围俘,位于F島的核電站,受9級(jí)特大地震影響琢融,放射性物質(zhì)發(fā)生泄漏界牡。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,237評(píng)論 3 329
  • 文/蒙蒙 一漾抬、第九天 我趴在偏房一處隱蔽的房頂上張望宿亡。 院中可真熱鬧,春花似錦奋蔚、人聲如沸她混。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,855評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)坤按。三九已至,卻和暖如春馒过,著一層夾襖步出監(jiān)牢的瞬間臭脓,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,983評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工腹忽, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留来累,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,048評(píng)論 3 370
  • 正文 我出身青樓窘奏,卻偏偏與公主長(zhǎng)得像嘹锁,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子着裹,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,864評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理领猾,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 134,656評(píng)論 18 139
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,117評(píng)論 25 707
  • 從三月份找實(shí)習(xí)到現(xiàn)在摔竿,面了一些公司面粮,掛了不少,但最終還是拿到小米继低、百度熬苍、阿里、京東袁翁、新浪柴底、CVTE、樂(lè)視家的研發(fā)崗...
    時(shí)芥藍(lán)閱讀 42,246評(píng)論 11 349
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法梦裂,類相關(guān)的語(yǔ)法似枕,內(nèi)部類的語(yǔ)法,繼承相關(guān)的語(yǔ)法年柠,異常的語(yǔ)法凿歼,線程的語(yǔ)...
    子非魚(yú)_t_閱讀 31,631評(píng)論 18 399
  • 一 理想答憔,你若是蝴蝶, 年少的我便會(huì)義無(wú)反顧的去追逐掀抹, 在那青草茫茫的廢棄的田地上虐拓, 理想,你若是蝴蝶傲武, 現(xiàn)在的我...
    顧子煢閱讀 115評(píng)論 0 1