日志打印
http://blog.csdn.net/mgoann/article/details/5681759
?
日志打印
?
日志重要性
日志規則
日志格式
?
1、日志重要性
?
????日志無論是在開發過程還是定位問題以及了解應用的運行軌跡都有非常重要的意義。日志打印也是一項技術活,好的日志對日后的維護工作帶來意想不到的幫助。
???
????通過日志的打印來定位問題
?
????通過日志的打印了解應用的運行軌跡
???
????通過日志完成性能調優
?
????通過日志了解應用狀態
?
???
???
2、日志規則
?
l????????打印日志是用來分析的不是用來看的
?
????日志有很大一部分作用是用來分析的。打印出便于分析的日志,就是好的日志。便于分析可以從生產環境來考慮,大部分的生產環境都是Linux操作系統,Linux操作系統文本分析工具很強大很方便。所以要從這個角度去考慮日志的打印,打印日志能夠使用簡單的grep命令或是awk命令就能將有用的信息提取出來。
如下是BossAgent模塊打印的日志。該日志記錄了從Boss測請求報文,以及請求報文轉換為MM2請求對象,以及發送給PSS的MM2對象結構體,以及從PSS測返回的MM2響應結構體。以及根據PSS測返回的MM2響應結構體組裝成xml報文返回給Boss測。該日志看似打印的很詳細,但是該日志缺乏總結性日志。也就是打印的都是流水賬,過于詳細,對于后期的日志分析帶來了很大的困難。
?
例如想統計所有13722223310號碼的注冊結果,使用Linux命令無法完成這個看似簡單的任務。因為缺乏總結性的日志,雖然從后臺返回的MM2結構體中我們可以看到該次業務請求的結果,但是當日志文件很大、打印速度飛快的情況下,使用VI或是cat命令是非常不現實的。而使用grep命令又無法得知結果,這樣的日志給后期的日志分析帶來很大困難。
?
????總結性日志提高可分析性
???
應該在最后加入該次請求的狀態,如129??17:23:09.782 13722223310 register success
你可能想這樣不就可以使用簡單的grep 13722223310 register?日志文件名,來查詢結果了嗎。
???
????使用狀態碼定義提高可分析性
?
????這樣的日志從分析角度來講還是不便于分析。例如success這樣的詞語在日志中應該是大量分布的。想通過該關鍵字來分析日志,會引入很多不必要的信息,給日志分析帶來麻煩。建議使用狀態碼例如使用200來代替success,這樣通過這個狀態碼可以過濾掉很多無用的信息。但是單純是使用grep 200?日志文件名,這樣手機號碼中包含200也會被搜索到。
?
????使用分隔符提高可分析性
?
????如上日志中可使用13722223310|register|200,這樣就可以使用簡單的命令grep提取關鍵信息,過濾掉無用雜亂的信息。
???
????相關日志盡量不要斷行
?
????Linux上強大簡單易用的文本分析工具,但是大多數分析工具都是以行為單位的,如awk grep sed wc,將相關日志打印到一行,可以免用多行處理,在行之間找對應關系。
?
l????????日志打印應該分層、分角度
???
一個好的日志不應該只打印與業務有關的日志。
日志打印應該從以下幾個方面去打印:
?
模塊運行日志:模塊運行日志包括消息隊列的監控、線程的運行狀態。該日志應該以INFO級別打印,并且采用間隔打印,或叫做定時打印。以減少日志打印總量。從該角度可以反應出該模塊是否有消息隊列積壓,是否所有線程都運行正常。消息隊列的打印可以采用日下格式:
????使用統一的關鍵字Monitor來標示模塊運行日志。隊列監控日志使用|隊列名|消息放入速度|消息取出速度|消息放入個數|消息取出個數|當前隊列消息個數|。線程監控日志使用|線程名|線程狀態碼|,線程狀態碼可以自己擴展。0表示正常1表示運行結束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| |
?
業務日志:業務日志打印用戶請求流程,能夠清楚的使用某幾個關鍵字可以提取一個用戶的業務流程就可以。業務日志要分詳細日志,如上BossAgent打印的日志,非常詳細,應該都打印DEBUG級別的日志,而另外就需要打印總結性日志,總結性日志以INFO級別打印,包括|請求開始時間|請求結束時間|請求主體|請求類型|請求結果|請求外部資源返回結果|。其中請求主體可以繼續擴展,如BossAgent的請求主體可以擴展為|手機號碼|省份編碼|MM2消息SEQUENCE|,DSS的請求主體可能屬性更多一些,|手機號碼|手機密碼|手機UA|手機MOD|手機MAN|計費類型|套餐類型|白名單|。
???
模塊性能日志:模塊的性能日志應該能夠通過該日志清晰的反應該模塊目前性能,包括外部請求的壓力,內部請求處理速度。
???
模塊外部資源日志:模塊的外部資源日志需要詳細記錄,現今單獨的模塊很少見了,很多大型復雜的系統往往是由多個模塊構成,模塊間采用或標準或私有協議進行通信。這種場景下爆發的問題往往比較復雜,并且與多個模塊都有關系或是責任。所以在模塊級別上將該模塊所依賴的外部資源都打印出來非常重要,通過這些日志應該能夠完成快速定位問題與哪些模塊相關聯或是哪些模塊需要負根本責任。通常模塊的外部資源包括數據庫,系統間內部模塊、第三方系統。如BossAgent的外部資源包括數據庫,系統間內部模塊為PSS、第三方系統應該是一級Boss。數據庫資源的打印應該包括所有的SQL語句,這個非常重要,無論是問題的定位還是后續的SQL優化,還是數據庫架構的調整,都需要這些信息能夠快讀的整理出該模塊所有的SQL語句,提供給專業的DBA進行分析。SQL語句的打印還應該包括參數的打印。
????第三方系統的打印主要包括,請求壓力的統計、截流告警、請求處理的延遲、以及超時。
?
l????????對異常的打印
?
異常日志的打印對于問題的分析和定義有極大的幫助,異常日志的打印應該注意以下幾點,雜異常分支必須打印日志。如switch case語句塊中的default,if else中的?else分支。Try catch語句塊中catch分支。對于catch分支的打印,應該盡量使用標準的異常打印,不應該打印的控制臺上,對于異常的處理不在本開發指南的討論范圍,所以簡單說明。異常應該打印堆棧信息,并且打印日志發生的場景。
???
l????????日志級別
???
????日志級別對于定位問題的重要性,在現網運營的過程中,往往都會打印低級別的日志,一些過于詳細得日志記錄程DEBUG,而一些總結性的日志記錄為INFO級別,對于外部資源日志,如果日志過于龐大,請將日志打印為DEBUG日志,在此基礎上在抽取總結性日志,打印為INFO日志。
?
l????????考慮日志對性能的影響
日志的頻繁打印會對模塊的性能產生極大的影響。如BPP的在每次接受到消息后都會打印消息結構體,將該日志注掉,性能在原有的基礎上上升了600條/秒。
?
l????????日志打印內容
?
l????????不打印無用的日志
?
如現網的BossAgent將與PSS之間通信的心跳消息結構體打印出來,該日志不僅打印頻繁,而且沒有任何意義。
?
l????????不打印不完全的日志
?
不打印不完全的日志,如BossAgent的消息隊列積壓的告警日志,只打印了消息隊列滿,但是沒有打印是誰滿了,也就是缺少主語,對于后續的定位產生了極大的阻礙。
?
l????????不打印重復的日志
如上BossAgent日志,將MM2消息結構體打印了多次,沒有任何意義。
?
l????????不在循環里打印日志
???
????如果代碼的邏輯是一個無限循環或是循環的次數較多,這里的日志不應當打印太過頻繁,使用盡量縮減日志量,并且將有用的信息打印出來。在循環打印日志或占用大量CPU時間,這里需要進行特殊的打印。就是采取間隔打印或是定時打印。
?
3、日志格式
?
日志格式統一使用主語+謂語+賓語+狀語的格式,日志打印應該遵從人類的自然語言,任何沒有開發經驗或是外行人都能從你的日志中捕獲到有用的信息,相信你的日志就打印的很成功了。
?
???????加入分隔符,使用分隔符使每個域都能夠清晰識別,分隔符可以提高日志可分析性,也可以過濾空格。
???????如下日志:13722223310 register 200,沒有采用域分隔符,這樣都手機號碼中出現異常數據如13722223310+空格,無法快速定位。加入域分隔符以后13722223310 |register|200|,可以清晰的看清楚手機號碼后有多余的空格。
轉載于:https://www.cnblogs.com/code-style/archive/2013/06/04/3117161.html
總結
- 上一篇: TianyaDL_4thread天涯帖子
- 下一篇: 关于ListView 自定义 Adapt