有关日志打印的几点经验
前段時(shí)間,完善智能導(dǎo)航發(fā)送告警短信中短信太長(zhǎng)接收不到的bug,牽涉出了日志打印的問(wèn)題;日志打印這件事說(shuō)小事小,說(shuō)大也大,寫好日志能方便自己調(diào)試代碼和發(fā)現(xiàn)解決問(wèn)題,以下就是有關(guān)日志打印自己總結(jié)的幾點(diǎn)經(jīng)驗(yàn)教訓(xùn):
日志打印應(yīng)該分層、分角度,一個(gè)好的日志不應(yīng)該只打印與業(yè)務(wù)有關(guān)的日志。
日志打印應(yīng)該從以下幾個(gè)方面去打印:
模塊運(yùn)行日志:模塊運(yùn)行日志包括消息隊(duì)列的監(jiān)控、線程的運(yùn)行狀態(tài)。該日志應(yīng)該以INFO級(jí)別打印,并且采用間隔打印,或叫做定時(shí)打印。以減少日志打印總量。從該角度可以反應(yīng)出該模塊是否有消息隊(duì)列積壓,是否所有線程都運(yùn)行正常。消息隊(duì)列的打印可以采用日下格式:
使用統(tǒng)一的關(guān)鍵字Monitor來(lái)標(biāo)示模塊運(yùn)行日志。隊(duì)列監(jiān)控日志使用|隊(duì)列名|消息放入速度|消息取出速度|消息放入個(gè)數(shù)|消息取出個(gè)數(shù)|當(dāng)前隊(duì)列消息個(gè)數(shù)|。線程監(jiān)控日志使用|線程名|線程狀態(tài)碼|,線程狀態(tài)碼可以自己擴(kuò)展。0表示正常1表示運(yùn)行結(jié)束2表示線程阻塞。
09:16:59.347 INFO |Monitor|ReceiveTimerQueue|0/s|0/s|0|0|0| 09:16:59.347 INFO |Monitor|SendRegistQueue|0/s|0/s|0|0|0| 09:16:59.347 INFO |Monitor|boss->omc|0/s|0/s|0|0|0| 09:16:59.347 INFO |Monitor|SendQueue|0/s|0/s|0|0|0| 09:16:59.347 INFO |Monitor|boss->pss|0/s|0/s|7037|7037|0| 09:16:59.347 INFO |Monitor|ReceiveAuthQueue|0/s|0/s|0|0|0| 09:16:59.347 INFO |Monitor|ReceiveQueue|0/s|0/s|0|0|0| 09:16:59.348 INFO |Monitor|receiveHandler5|0|SendHandler1|0|receiveAuthMsgHandleThread1|0| receiveTimerMsgHandler1|0|SendRegHandler|0|SendHandler3|0|SendHandler2|0|receiveHandler4|0|receiveHandler8|0|receiveHandler7|0|receiveHandler2|0|receiveHandler3|0|receiveHandler6|0|receiveHandler1|0|業(yè)務(wù)日志:業(yè)務(wù)日志打印用戶請(qǐng)求流程,能夠清楚的使用某幾個(gè)關(guān)鍵字可以提取一個(gè)用戶的業(yè)務(wù)流程就可以。業(yè)務(wù)日志要分詳細(xì)日志,如上BossAgent打印的日志,非常詳細(xì),應(yīng)該都打印DEBUG級(jí)別的日志,而另外就需要打印總結(jié)性日志,總結(jié)性日志以INFO級(jí)別打印,包括|請(qǐng)求開(kāi)始時(shí)間|請(qǐng)求結(jié)束時(shí)間|請(qǐng)求主體|請(qǐng)求類型|請(qǐng)求結(jié)果|請(qǐng)求外部資源返回結(jié)果|。其中請(qǐng)求主體可以繼續(xù)擴(kuò)展,如BossAgent的請(qǐng)求主體可以擴(kuò)展為|手機(jī)號(hào)碼|省份編碼|MM2消息SEQUENCE|,DSS的請(qǐng)求主體可能屬性更多一些,|手機(jī)號(hào)碼|手機(jī)密碼|手機(jī)UA|手機(jī)MOD|手機(jī)MAN|計(jì)費(fèi)類型|套餐類型|白名單|。
模塊性能日志:模塊的性能日志應(yīng)該能夠通過(guò)該日志清晰的反應(yīng)該模塊目前性能,包括外部請(qǐng)求的壓力,內(nèi)部請(qǐng)求處理速度。
模塊外部資源日志:模塊的外部資源日志需要詳細(xì)記錄,現(xiàn)今單獨(dú)的模塊很少見(jiàn)了,很多大型復(fù)雜的系統(tǒng)往往是由多個(gè)模塊構(gòu)成,模塊間采用或標(biāo)準(zhǔn)或私有協(xié)議進(jìn)行通信。這種場(chǎng)景下爆發(fā)的問(wèn)題往往比較復(fù)雜,并且與多個(gè)模塊都有關(guān)系或是責(zé)任。所以在模塊級(jí)別上將該模塊所依賴的外部資源都打印出來(lái)非常重要,通過(guò)這些日志應(yīng)該能夠完成快速定位問(wèn)題與哪些模塊相關(guān)聯(lián)或是哪些模塊需要負(fù)根本責(zé)任。通常模塊的外部資源包括數(shù)據(jù)庫(kù),系統(tǒng)間內(nèi)部模塊、第三方系統(tǒng)。如BossAgent的外部資源包括數(shù)據(jù)庫(kù),系統(tǒng)間內(nèi)部模塊為PSS、第三方系統(tǒng)應(yīng)該是一級(jí)Boss。數(shù)據(jù)庫(kù)資源的打印應(yīng)該包括所有的SQL語(yǔ)句,這個(gè)非常重要,無(wú)論是問(wèn)題的定位還是后續(xù)的SQL優(yōu)化,還是數(shù)據(jù)庫(kù)架構(gòu)的調(diào)整,都需要這些信息能夠快讀的整理出該模塊所有的SQL語(yǔ)句,提供給專業(yè)的DBA進(jìn)行分析。SQL語(yǔ)句的打印還應(yīng)該包括參數(shù)的打印。
第三方系統(tǒng)的打印主要包括,請(qǐng)求壓力的統(tǒng)計(jì)、截流告警、請(qǐng)求處理的延遲、以及超時(shí)。
1、對(duì)異常的打印
異常日志的打印對(duì)于問(wèn)題的分析和定義有極大的幫助,異常日志的打印應(yīng)該注意以下幾點(diǎn),雜異常分支必須打印日志。如switch case語(yǔ)句塊中的default,if else中的 else分支。Try catch語(yǔ)句塊中catch分支。對(duì)于catch分支的打印,應(yīng)該盡量使用標(biāo)準(zhǔn)的異常打印,不應(yīng)該打印的控制臺(tái)上,對(duì)于異常的處理不在本開(kāi)發(fā)指南的討論范圍,所以簡(jiǎn)單說(shuō)明。異常應(yīng)該打印堆棧信息,并且打印日志發(fā)生的場(chǎng)景。
2、日志級(jí)別
日志級(jí)別對(duì)于定位問(wèn)題的重要性,在現(xiàn)網(wǎng)運(yùn)營(yíng)的過(guò)程中,往往都會(huì)打印低級(jí)別的日志,一些過(guò)于詳細(xì)得日志記錄程DEBUG,而一些總結(jié)性的日志記錄為INFO級(jí)別,對(duì)于外部資源日志,如果日志過(guò)于龐大,請(qǐng)將日志打印為DEBUG日志,在此基礎(chǔ)上在抽取總結(jié)性日志,打印為INFO日志。
3、考慮日志對(duì)性能的影響
日志的頻繁打印會(huì)對(duì)模塊的性能產(chǎn)生極大的影響。如BPP的在每次接受到消息后都會(huì)打印消息結(jié)構(gòu)體,將該日志注掉,性能在原有的基礎(chǔ)上上升了600條/秒。
4、日志打印內(nèi)容
4.1 不打印無(wú)用的日志
如現(xiàn)網(wǎng)的BossAgent將與PSS之間通信的心跳消息結(jié)構(gòu)體打印出來(lái),該日志不僅打印頻繁,而且沒(méi)有任何意義。
4.1 不打印不完全的日志
不打印不完全的日志,如BossAgent的消息隊(duì)列積壓的告警日志,只打印了消息隊(duì)列滿,但是沒(méi)有打印是誰(shuí)滿了,也就是缺少主語(yǔ),對(duì)于后續(xù)的定位產(chǎn)生了極大的阻礙。
4.3不打印重復(fù)的日志
如上BossAgent日志,將MM2消息結(jié)構(gòu)體打印了多次,沒(méi)有任何意義。
4.4不在循環(huán)里打印日志
如果代碼的邏輯是一個(gè)無(wú)限循環(huán)或是循環(huán)的次數(shù)較多,這里的日志不應(yīng)當(dāng)打印太過(guò)頻繁,使用盡量縮減日志量,并且將有用的信息打印出來(lái)。在循環(huán)打印日志或占用大量CPU時(shí)間,這里需要進(jìn)行特殊的打印。就是采取間隔打印或是定時(shí)打印。
5、日志格式
日志格式統(tǒng)一使用主語(yǔ)+謂語(yǔ)+賓語(yǔ)+狀語(yǔ)的格式,日志打印應(yīng)該遵從人類的自然語(yǔ)言,任何沒(méi)有開(kāi)發(fā)經(jīng)驗(yàn)或是外行人都能從你的日志中捕獲到有用的信息,相信你的日志就打印的很成功了。
加入分隔符,使用分隔符使每個(gè)域都能夠清晰識(shí)別,分隔符可以提高日志可分析性,也可以過(guò)濾空格。
如下日志:13722223310 register 200,沒(méi)有采用域分隔符,這樣都手機(jī)號(hào)碼中出現(xiàn)異常數(shù)據(jù)如13722223310+空格,無(wú)法快速定位。加入域分隔符以后13722223310 |register|200|,可以清晰的看清楚手機(jī)號(hào)碼后有多余的空格。
還有更多的有關(guān)日志打印的內(nèi)容參照以下文章。
http://ju.outofmemory.cn/entry/72841
http://blog.csdn.net/mgoann/article/details/5681759
總結(jié)
以上是生活随笔為你收集整理的有关日志打印的几点经验的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: (十)HTML5本地存储——SQLLit
- 下一篇: 在一台服务器上配置多个Tomcat的方法