應(yīng)用系統(tǒng)日志打印規(guī)范實(shí)踐之道
如果你是一名優(yōu)秀的應(yīng)用系統(tǒng)開(kāi)發(fā)人員,想必應(yīng)該非常清楚在應(yīng)用系統(tǒng)運(yùn)行期間,打印日志有多么重要打印。它不但能夠記錄應(yīng)用系統(tǒng)運(yùn)行情況及軌跡,還有助于提升故障排查及定位問(wèn)題的效率,甚至還可以對(duì)其進(jìn)行分析及監(jiān)控,洞察系統(tǒng)隱患,提前預(yù)警防范。
但并不是說(shuō)只要打印盡可能多的日志,就能輕松獲得這些能力打印。設(shè)想一下,如果你肆無(wú)忌憚地打印了一堆毫無(wú)價(jià)值的日志,那請(qǐng)問(wèn)日志又何以能夠來(lái)為你提供價(jià)值呢。由此可見(jiàn),這里的核心關(guān)鍵點(diǎn)并不在于日志的多少,而在于日志打印是否規(guī)范且合理。
不規(guī)范合理的日志,不但無(wú)法發(fā)揮作用產(chǎn)生價(jià)值,還會(huì)增加故障定位難度、降低解決效率,以及額外增加日志存儲(chǔ)成本,消耗應(yīng)用系統(tǒng)性能打印。在極端情況下,甚至還會(huì)對(duì)應(yīng)用系統(tǒng)造成致命性打擊,引發(fā)應(yīng)用系統(tǒng)癱瘓的可能。
講到這,我想你應(yīng)該明白我想說(shuō)的——應(yīng)用系統(tǒng)日志打印確實(shí)非常重要,但日志打印規(guī)范將更為重要,它就像一把雙刃劍,只有合理運(yùn)用才能發(fā)揮其特有的作用及價(jià)值打印。
但在組織中,如果你想讓你周?chē)娜硕寄苊靼走@個(gè)道理可并不容易,它需要一個(gè)漫長(zhǎng)的傳播過(guò)程,而在這個(gè)過(guò)程中,你不僅需要堅(jiān)持不斷地宣導(dǎo)來(lái)逐步增強(qiáng)他們的認(rèn)知,還應(yīng)借助必要的治理手段及工具平臺(tái)進(jìn)行輔助,只有利其所器,才能善其所事打印。
利器一:規(guī)范先行
在你想啟動(dòng)規(guī)范化日志打印前,建議先制定一份日志打印規(guī)范,它可能無(wú)法面面俱到,但沒(méi)有關(guān)系,它的目的僅是為了先突顯日志打印規(guī)范的重要性,并且讓這件事情能夠正式進(jìn)入正軌打印。
如果組織中大部分都是Java應(yīng)用,那么規(guī)范內(nèi)容可以主要圍繞Java應(yīng)用來(lái)寫(xiě),雖然無(wú)法覆蓋所有開(kāi)發(fā)語(yǔ)言,但其核心原則仍是可以借鑒的打印。另外,前期請(qǐng)務(wù)必不要將其復(fù)雜化,否則它將無(wú)法具備普適性,也無(wú)法被接受和傳播。
Java應(yīng)用系統(tǒng)日志打印規(guī)范
1)Java日志框架
常用的Java日志框架可選擇Log*j/Logback/Log*j2等,但為了避免后續(xù)更換日志框架所帶來(lái)的額外改造成本,建議將接口層和實(shí)現(xiàn)層進(jìn)行分離,將SLF*J作為接口層,將Log*j/Logback/Log*j2作為實(shí)現(xiàn)層,兩者通過(guò)橋接的方式進(jìn)行集成打印。
2)Java日志規(guī)范
規(guī)范一:【強(qiáng)制】級(jí)別只允許使用ERROR、WARN、INFO、DEBUG打印,定義如下:
規(guī)范二:【強(qiáng)制】禁止使用Logback/Log*j2等的API,應(yīng)使用SLF*J的API打印。
規(guī)范三:【強(qiáng)制】在接口/方法的入口/出口處,打印請(qǐng)求及響應(yīng)參數(shù)日志打印。
規(guī)范四:【強(qiáng)制】ERROR級(jí)別日志需打印堆棧,而非ERROR級(jí)別日志則不需要打印。
規(guī)范五:【強(qiáng)制】禁止在代碼循環(huán)體中直接打印非DEBUG級(jí)別的日志打印。
規(guī)范六:【強(qiáng)制】禁止日志打印內(nèi)容中僅打印特殊字符或數(shù)字的情況打印。
規(guī)范七:【建議】日志內(nèi)容中應(yīng)包含關(guān)鍵特征類(lèi)信息,例如:用戶(hù)標(biāo)識(shí)或流水號(hào)打印。
規(guī)范八:【建議】應(yīng)采用異步打印模式,且打印時(shí)建議關(guān)閉打印位置信息打印。
規(guī)范九:【建議】日志打印若出現(xiàn)堵塞,建議至少丟棄INFO級(jí)別以上的日志打印。
規(guī)范十:【建議】每條日志在語(yǔ)義上可獨(dú)立被理解,減少上下文關(guān)聯(lián)理解打印。
*)Java日志字段
注:位置信息包括類(lèi)(class)/文件(file)/行號(hào)(line)/方法(method),若打印位置信息,則對(duì)性能有所影響打印。
以上僅是一些規(guī)范參考,你可以根據(jù)組織中的實(shí)際情況來(lái)進(jìn)行調(diào)整,但規(guī)范僅僅只是規(guī)范,有了它并不代表你已達(dá)成目標(biāo),只能說(shuō)明你已為日志打印規(guī)范化這件事,邁出了第一步打印。
利器二:服務(wù)至上
當(dāng)制定完應(yīng)用系統(tǒng)日志打印規(guī)范后,請(qǐng)不要幻想有任何人會(huì)來(lái)自覺(jué)地遵守它,一是不知它的存在,二是他們無(wú)從下手,三是大家都挺“忙”的打印。我把它總結(jié)為六字真言,分別是“不知”、“不會(huì)”、“不想”。
我曾見(jiàn)過(guò)組織中的有些規(guī)范,特別是技術(shù)規(guī)范,在制定完成后就會(huì)被長(zhǎng)久地封存起來(lái),沒(méi)有人知道,也沒(méi)有人想知道打印。所以,要落實(shí)好規(guī)范,你還得構(gòu)思一套戰(zhàn)術(shù)才行。否則,那些無(wú)法落實(shí)的規(guī)范就和廢紙毫無(wú)兩樣。
在很多人眼里,可能會(huì)將規(guī)范視為是一種約束,而又錯(cuò)誤地將約束理解為貶義詞,從而避而遠(yuǎn)之打印。這種誤解的發(fā)生,其原因并不出在他們本身,而更多的出在那些制定規(guī)范的人身上。
有些規(guī)范制定者不但沒(méi)有身在其中,甚至也沒(méi)有去詮釋規(guī)范所能帶來(lái)的價(jià)值,而僅僅只是強(qiáng)行推行那份冷冰冰的規(guī)范,請(qǐng)問(wèn)此時(shí)誰(shuí)會(huì)樂(lè)意在不知其所以然的情況下,無(wú)緣無(wú)故地背上這沉重的“負(fù)擔(dān)”打印。
因此,你必須得為這份規(guī)范賦予更多的“溫度”,而主動(dòng)服務(wù)可能會(huì)是一種比較好的“升溫”方式打印。但在行動(dòng)前,切忌不要站在他們的對(duì)立面,并請(qǐng)做好放低姿態(tài)的覺(jué)悟,你要讓對(duì)方深刻的意識(shí)到你和他們是同一陣營(yíng)的。
在發(fā)布規(guī)范后的初期,你可以嘗試挑選幾個(gè)日志打印情況最為糟糕的應(yīng)用系統(tǒng),扮演為“VIP私人助理”來(lái)與對(duì)方進(jìn)一步傳達(dá)規(guī)范內(nèi)容及作用,并為他們逐一列舉出當(dāng)前存在的日志打印問(wèn)題,以及這些問(wèn)題會(huì)對(duì)系統(tǒng)造成哪些影響打印。
這種方式不但能夠避免僅用文字傳達(dá)所產(chǎn)生的理解偏差,及時(shí)有效地為對(duì)方解答各種疑問(wèn),使他們能夠更深一步地理解規(guī)范內(nèi)容及作用,還能夠讓規(guī)范制定者更進(jìn)一步地了解對(duì)方的顧慮及困難,并從同理心視角出發(fā),為對(duì)方提供更好的建議及解決思路打印。
就這樣*個(gè)、10個(gè)、1*個(gè)應(yīng)用系統(tǒng)......在精力有限的前提下逐步擴(kuò)大輻射范圍,事實(shí)證明,這種主動(dòng)服務(wù)+循序漸進(jìn)的方式對(duì)提升規(guī)范的接受度將會(huì)有所幫助打印。不過(guò)在過(guò)程中你仍然需要不斷回看規(guī)范的合理性及適用性,并對(duì)規(guī)范作出及時(shí)且有效的調(diào)整。
利器三:度量為王
當(dāng)規(guī)范逐漸被更多的人接受后,你的使命并沒(méi)有完成,而真正的考驗(yàn)才剛剛開(kāi)始打印。一是接受并不代表整改,二是如何驗(yàn)證整改有效性,三是整改是否可持續(xù)性。如果這些問(wèn)題都不在你的考慮范圍內(nèi),那你可能會(huì)前功盡棄。
若想要解決以上這些問(wèn)題,借助度量或許會(huì)是一個(gè)不錯(cuò)的選擇打印。管理大師德魯克曾說(shuō)過(guò):“沒(méi)有度量,就沒(méi)有管理”,它同樣適用于規(guī)范的落實(shí)工作,你可以根據(jù)日志打印規(guī)范來(lái)制定一些度量指標(biāo),并配套研發(fā)相應(yīng)的度量工具平臺(tái)。
通過(guò)度量工具平臺(tái)“可視化”和“自助化”的兩種特性,讓開(kāi)發(fā)人員能夠及時(shí)發(fā)現(xiàn)日志打印規(guī)范的問(wèn)題,還能夠讓他們自主驗(yàn)證日志打印規(guī)范整改后的效果,從而讓他們感受到一種“看得見(jiàn)”+“摸得著”的安全感打印。
其中,度量指標(biāo)的設(shè)計(jì)將會(huì)尤其重要,往往一個(gè)不合理的指標(biāo),會(huì)讓整個(gè)事情朝著預(yù)想中的反方向發(fā)展打印。所以,在初期并不建議你設(shè)計(jì)過(guò)多的度量指標(biāo),并建議從度量難度、影響程度、達(dá)成難度、可解釋性四個(gè)方面進(jìn)行綜合性評(píng)估,以確定較為合理的指標(biāo)。
如下是當(dāng)時(shí)初期選擇的*個(gè)指標(biāo)打印。
注:以上僅列出指標(biāo),指標(biāo)要求建議你可根據(jù)實(shí)際情況進(jìn)行動(dòng)態(tài)調(diào)整,但過(guò)高的指標(biāo)要求會(huì)變得毫無(wú)意義打印。
可能會(huì)有人提出,對(duì)于規(guī)模較大且日志條數(shù)較多的應(yīng)用系統(tǒng),是否可放寬指標(biāo)要求,這聽(tīng)上去好像蠻有道理的,但我卻并不這么認(rèn)為打印。規(guī)模越大意味著所承載的職責(zé)和能力也就越大,一旦發(fā)生故障影響面也就越大,所以反倒更應(yīng)該達(dá)到指標(biāo)要求。
這些指標(biāo)雖然有一定的指導(dǎo)性,但似乎并不能滿(mǎn)足開(kāi)發(fā)人員的“胃口”,因?yàn)檫@些指標(biāo)仍然無(wú)法直接暴露問(wèn)題根源,也無(wú)法讓他們可快速定位及明確優(yōu)化方向打印。因此,你還得賦予指標(biāo)一定的分析能力。
例如:訂單系統(tǒng)單日ERROR級(jí)別日志***條(占日志總量0.0*%),(TOP1)90%在com.OrderService的第**行打印。(TOP2)10%在com.PayService的第1**行。
就這樣,你可以逐步完善指標(biāo)體系及配套的分析能力,但請(qǐng)?jiān)谠O(shè)計(jì)每一個(gè)指標(biāo)時(shí),遵循先進(jìn)行系統(tǒng)現(xiàn)狀摸排,再進(jìn)行小范圍試點(diǎn)運(yùn)行,最后進(jìn)行持續(xù)觀(guān)測(cè)并調(diào)優(yōu),從而確保每一個(gè)指標(biāo)的設(shè)計(jì)都具備一定的合理性和可解釋性打印。
如下列出了一些指標(biāo),僅供參考打印。
除此之外,你還可以將不同應(yīng)用系統(tǒng)的指標(biāo)進(jìn)行橫向?qū)Ρ?,并采用排行榜的形式在科技?nèi)部進(jìn)行公開(kāi),它將會(huì)產(chǎn)生一種改變行為的驅(qū)動(dòng)力,可以有效激發(fā)“想要贏(yíng)”和“不想失敗”的心理活動(dòng),這就好比某些產(chǎn)品也會(huì)采用排行榜的方式來(lái)激勵(lì)用戶(hù)一樣打印。
通過(guò)設(shè)計(jì)指標(biāo)體系+研發(fā)度量平臺(tái)+公開(kāi)排行榜單這三個(gè)手段的組合,在一定程度上可以驅(qū)動(dòng)開(kāi)發(fā)人員持續(xù)性整改日志打印的問(wèn)題打印。但萬(wàn)事無(wú)絕對(duì),那些始終無(wú)動(dòng)于衷的人依然會(huì)存在,不過(guò)請(qǐng)不要強(qiáng)行要求對(duì)方,畢竟有時(shí)候存在即合理。
寫(xiě)在最后
日志打印規(guī)范固然重要,但也請(qǐng)不要過(guò)分追捧,它的核心價(jià)值還是在于能夠幫助開(kāi)發(fā)人員更好地記錄應(yīng)用系統(tǒng)的“案發(fā)現(xiàn)場(chǎng)”,并可為應(yīng)用系統(tǒng)提供可持續(xù)改進(jìn)的“線(xiàn)索”打印。但請(qǐng)牢記,日志打印規(guī)范雖不是萬(wàn)能的,但沒(méi)有日志打印規(guī)范卻是萬(wàn)萬(wàn)不能的。
作者丨陳俊
來(lái)源丨*:技術(shù)奇妙物語(yǔ)(ID:gh_cfee2fb**9bc)
021yin.com
更多精彩內(nèi)容
11月19日下午1*:00,dbaplus社群攜手中國(guó)銀行,圍繞“中國(guó)銀行運(yùn)維轉(zhuǎn)型與敏捷開(kāi)發(fā)探索實(shí)踐”這一主題開(kāi)展線(xiàn)上直播分享,針對(duì)運(yùn)維監(jiān)控、混沌工程、DevOps等內(nèi)容進(jìn)行深度探討,為金融業(yè)的數(shù)字化轉(zhuǎn)型提供更多新思路打印。
021yin.com/*t*OC
關(guān)于打印我們
dbaplus社群是圍繞Database、BigData、AIOps的企業(yè)級(jí)專(zhuān)業(yè)社群打印。資深大咖、技術(shù)干貨,每天精品原創(chuàng)文章推送,每周線(xiàn)上技術(shù)分享,每月線(xiàn)下技術(shù)沙龍,每季度GdevopsDAMS行業(yè)大會(huì)。
關(guān)注*【dbaplus社群】打印,獲取更多原創(chuàng)技術(shù)文章和精選工具下載