日志處理
日志處理是一個(gè)很重要的概念,我們將嘗試其中一些工具,比如ELK( Elasticsearch、Logstash和Kibana)。
傳統(tǒng)意義上的日志只是在代碼中使用簡(jiǎn)單的打印語(yǔ)句來(lái)追蹤代碼中的事件。有時(shí)候這被叫作打印式調(diào)試(print-style debugging),因?yàn)楦櫞a行為而不是使用常規(guī)的調(diào)試器。
下面是一個(gè)C語(yǔ)言風(fēng)格的簡(jiǎn)單例子。目的是為了知道當(dāng)我們輸入函數(shù)fn (x)時(shí),傳入的參數(shù)x值是什么:
void fn ( char *x) {
printf ("DEBUG entering fn, x is ooSIl", X) ;}
從控制臺(tái)的調(diào)試追蹤可以知道程序表現(xiàn)的行為和我們開(kāi)發(fā)時(shí)期望的一樣。
當(dāng)然,你也希望看到程序中是否發(fā)生了什么嚴(yán)重的事情,并且以較高的優(yōu)先級(jí)去匯報(bào):
printf ("ERROR x cant be an empty string
");這種風(fēng)格的調(diào)試有幾個(gè)問(wèn)題。在你想知道程序行為時(shí)它是有用的,但是在你完成代碼后想要部署時(shí)就沒(méi)有那么有用了。
目前,有大量基于上述實(shí)踐考驗(yàn)的框架,支持不同的日志方式。
日志框架比打印風(fēng)格的日志有更多的價(jià)值,尤其是在定義標(biāo)準(zhǔn)和提供改進(jìn)的功能上,如以下這些:
國(guó) 不同的日志優(yōu)先級(jí),比如Debug、Warning、Trace和Error。
。 過(guò)濾不同優(yōu)先級(jí)的日志信息。你不可能對(duì)所有的調(diào)試信息有興趣,但是一定會(huì)對(duì)錯(cuò)誤感興趣。
。 將日志記錄在固定的目的地,比如文件、數(shù)據(jù)庫(kù)或者網(wǎng)絡(luò)進(jìn)程。這包括我們稍后會(huì)了解的ELK。
。 日志文件的輪替和歸檔。老的日志文件可以被歸檔。
時(shí)不時(shí)地就會(huì)有新的日志框架出現(xiàn),所以即使在如今,曰志問(wèn)題領(lǐng)域看上去也還遠(yuǎn)遠(yuǎn)沒(méi)有到令人滿意的地步。這種趨勢(shì)是可以理解的,因?yàn)樘幚淼卯?dāng)?shù)娜罩究梢詭椭銣?zhǔn)確判斷一個(gè)不再運(yùn)行的網(wǎng)絡(luò)服務(wù)的失敗原因,或者你不經(jīng)常管理的復(fù)雜服務(wù)。日志也很難做好,因?yàn)檫^(guò)度的日志會(huì)降低服務(wù)的性能,日志太少又不能幫你診斷失敗的原因。因此,曰志系統(tǒng)盡力去在日志的不同特性間達(dá)到一個(gè)平衡。