项目信息追踪(Log)
2019獨(dú)角獸企業(yè)重金招聘Python工程師標(biāo)準(zhǔn)>>>
如果項(xiàng)目上過(guò)線的話,那你一定知道Log是多么重要。
為什么說(shuō)Log重要呢?因?yàn)樯暇€項(xiàng)目不允許你調(diào)試,你只能通過(guò)Log來(lái)分析問(wèn)題。這時(shí)打一手好Log的重要性絕不亞于寫一手好代碼。項(xiàng)目出問(wèn)題時(shí),你要能拿出Log證明自己負(fù)責(zé)的部分沒(méi)有問(wèn)題,如果是自己的問(wèn)題,要從Log里快速找出錯(cuò)誤原因。如果沒(méi)有從Log里找出錯(cuò)誤原因,那一定是一件很悲催的事情,特別是在bug不容易重現(xiàn)的情況下。那簡(jiǎn)直就是叫天天不靈,叫地地不應(yīng)啊。
一.Log級(jí)別
Log最常用的級(jí)別就是DEBUG,INFO,WARN,ERROR,其他的很少用。如何運(yùn)用合適的Log級(jí)別也是非常重要的,在不該用ERROR的地方用了ERROR,可能會(huì)給你帶來(lái)額外的麻煩。下邊僅根據(jù)自己的使用習(xí)慣,分別說(shuō)一下我對(duì)各種級(jí)別的理解。
1.ERROR:
ERROR是錯(cuò)誤的意思,但不代表出現(xiàn)異常的地方就該打ERROR。我認(rèn)為ERROR是相對(duì)程序正確運(yùn)行來(lái)說(shuō)的,如果出現(xiàn)了ERROR那就代表出問(wèn)題了,開發(fā)人員必須要查一下原因,或許是程序問(wèn)題,或許是環(huán)境問(wèn)題,或許是理論上不該出錯(cuò)的地方出錯(cuò)了。總之,如果你覺(jué)得某個(gè)地方出問(wèn)題時(shí)需要解決,就打ERROR,如果不需要解決就不要打ERROR。
舉例來(lái)說(shuō),如果有一個(gè)接口。調(diào)用者傳過(guò)來(lái)的參數(shù)不在你的接受范圍內(nèi),在這種情況下你不能打ERROR,因?yàn)閭魇裁粗凳怯脩魶Q定的,并不影響程序正確運(yùn)行。想象一下,如果你的服務(wù)器上有監(jiān)控程序的話,檢測(cè)到ERROR或WARN就報(bào)警,參數(shù)錯(cuò)誤你也打ERROR,那運(yùn)維人員會(huì)瘋掉的。
如果做一個(gè)對(duì)講機(jī),在解析語(yǔ)音數(shù)據(jù)包時(shí)出錯(cuò)了,那就要打ERROR了,因?yàn)檫@個(gè)是理論上不該出錯(cuò)的地方,要不就是你的解析代碼有問(wèn)題,要不就是開發(fā)人員在拼湊語(yǔ)音包時(shí)存在問(wèn)題,這個(gè)時(shí)候需要你來(lái)找出問(wèn)題的原因。所以應(yīng)該打ERROR。
2.WARN:
WARN是指出現(xiàn)了不影響程序正確運(yùn)行的問(wèn)題,WARN也是問(wèn)題但不影響程序正常運(yùn)行,如果WARN出現(xiàn)的過(guò)于頻繁或次數(shù)太多,那就代表你要檢查一下程序或環(huán)境或依賴程序是否真的出問(wèn)題了。
假如你訪問(wèn)一個(gè)接口,設(shè)置了一個(gè)超時(shí),超時(shí)之后會(huì)拋異常,你在try塊里不該打ERROR也不該打INFO來(lái)無(wú)視它,這時(shí)你應(yīng)該打WARN,緊緊是警告一下,如果超時(shí)過(guò)多那就該檢查一下了,是不是對(duì)方接口有問(wèn)題了或者是網(wǎng)絡(luò)環(huán)境出問(wèn)題了。
3.INFO和DEBUG:
ERROR和WARN是指有問(wèn)題,而INFO和DEBUG就是指一般的信息了。在程序出問(wèn)題時(shí),如果這條log可以幫助你分析問(wèn)題或查看程序的運(yùn)行情況,那就應(yīng)該打個(gè)INFO。如果僅僅是為了在調(diào)試階段查看程序是否運(yùn)行正確那就要打DEBUG。前邊討論的接口參數(shù)錯(cuò)誤問(wèn)題,就應(yīng)該打個(gè)INFO了,調(diào)用者說(shuō)你的接口總是返回錯(cuò)誤代碼,你可以告訴他,是他的哪個(gè)參數(shù)傳錯(cuò)了。
二.如何打
1.log必備信息
在每一條log中都要將時(shí)間、類名及函數(shù)名,可以的話將行號(hào)也打印出來(lái)(不建議手寫行號(hào)),像java的log4j就是不錯(cuò)的。
2.函數(shù)開始結(jié)束處
在重要函數(shù)的開始結(jié)束出應(yīng)該打上log ,這樣在看log時(shí)會(huì)比較直觀,什么時(shí)候開始什么時(shí)候結(jié)束就會(huì)一目了然,萬(wàn)一中間出異常導(dǎo)致程序退出了,也知道是在哪個(gè)函數(shù)突然中斷的。也同樣適用于一個(gè)重要邏輯塊的開始結(jié)束。
3.返回結(jié)果
盡量在重要函數(shù)或web接口的每個(gè)返回分支打印返回結(jié)果。在出現(xiàn)不好分析的異常時(shí),從細(xì)節(jié)下手,這時(shí)log會(huì)派上用場(chǎng)。如果跟合作方在數(shù)據(jù)方面出現(xiàn)爭(zhēng)議也可以及時(shí)拿出證據(jù)。
4.添加Exception異常的捕獲
如果你在代碼中捕獲了某種異常,那你要在try塊后添加Exception的捕獲,以防出現(xiàn)運(yùn)行時(shí)異常中斷程序。
5.務(wù)必打印堆棧信息
在異常捕獲代碼中務(wù)必要將堆棧信息打印出來(lái),否則打了那么多的log可能會(huì)功虧一簣。
6.多線程的log
在多線程的程序中,log最好要標(biāo)記thredId,否則可能不知道是哪個(gè)線程的作業(yè),也無(wú)法有條理的來(lái)觀察一個(gè)線程。
7.成功失敗標(biāo)志
如果某個(gè)函數(shù)是做一件比較關(guān)鍵的事情,那么這件事情成功還是失敗了,要打印log,否則關(guān)鍵事件運(yùn)行結(jié)果如何都拿不出證據(jù)的話,實(shí)在是不能讓人信服。
8.前后log的關(guān)系
如果是web程序或接口,那log就不是按照你預(yù)定的順序出現(xiàn)的,可能是好幾個(gè)響應(yīng)的log穿插在一起的。代碼里如果有幾條log前后存在一定的數(shù)據(jù)關(guān)系,那么要將這幾條log的關(guān)聯(lián)信息打出來(lái),用來(lái)確定是針對(duì)同一個(gè)響應(yīng)的。如果沒(méi)有明確的標(biāo)志,很難說(shuō)后邊的log跟前邊的log是同一個(gè)響應(yīng)或者是針對(duì)同一條數(shù)據(jù)。
9.關(guān)于耗時(shí)
訪問(wèn)一個(gè)第三方接口、上傳下載文件等可能耗時(shí)的操作,都要記錄完成這個(gè)操作所耗的時(shí)間。否則程序性能出了問(wèn)題,你不知道是網(wǎng)絡(luò)原因呢,還是你調(diào)用的第三方接口性能出現(xiàn)問(wèn)題呢,還是你自己程序的問(wèn)題呢。
10.關(guān)于數(shù)量
涉及到數(shù)量的操作要打印log,比如查詢數(shù)據(jù)庫(kù)和批量拷貝文件、上傳下載、批量格式轉(zhuǎn)換等批量操作,設(shè)計(jì)到的數(shù)量要打印出來(lái)。
總之,打log的目的是為了迅速排錯(cuò)或在有爭(zhēng)議時(shí)拿出證據(jù)證明自己。基于這個(gè)目的,log不在多,只要抓住一切對(duì)自己有利的信息,就可以了。
想起其他的再繼續(xù)補(bǔ)充吧,歡迎大家拍磚補(bǔ)充。
本人學(xué)識(shí)尚淺,寫文目的是為了得到大家指點(diǎn)。 倘若文章幫到了您,那真是好極了。
轉(zhuǎn)載于:https://my.oschina.net/u/1418722/blog/202557
總結(jié)
以上是生活随笔為你收集整理的项目信息追踪(Log)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: SSH框架中不为人知的细节(一)
- 下一篇: Android拍照流程