如何打一手好Log


  如果項目上過線的話,那你一定知道Log是多么重要。

  為什么說Log重要呢?因為上線項目不允許你調試,你只能通過Log來分析問題。這時打一手好Log的重要性絕不亞於寫一手好代碼。項目出問題時,你要能拿出Log證明自己負責的部分沒有問題,如果是自己的問題,要從Log里快速找出錯誤原因。如果沒有從Log里找出錯誤原因,那一定是一件很悲催的事情,特別是在bug不容易重現的情況下。那簡直就是叫天天不靈,叫地地不應啊。

 

  一.Log級別

  Log最常用的級別就是DEBUG,INFO,WARN,ERROR,其他的很少用。如何運用合適的Log級別也是非常重要的,在不該用ERROR的地方用了ERROR,可能會給你帶來額外的麻煩。下邊僅根據自己的使用習慣,分別說一下我對各種級別的理解。

  1.ERROR:

  ERROR是錯誤的意思,但不代表出現異常的地方就該打ERROR。我認為ERROR是相對程序正確運行來說的,如果出現了ERROR那就代表出問題了,開發人員必須要查一下原因,或許是程序問題,或許是環境問題,或許是理論上不該出錯的地方出錯了。總之,如果你覺得某個地方出問題時需要解決,就打ERROR,如果不需要解決就不要打ERROR。

  舉例來說,如果有一個接口。調用者傳過來的參數不在你的接受范圍內,在這種情況下你不能打ERROR,因為傳什么值是用戶決定的,並不影響程序正確運行。想象一下,如果你的服務器上有監控程序的話,檢測到ERROR或WARN就報警,參數錯誤你也打ERROR,那運維人員會瘋掉的。

  如果做一個對講機,在解析語音數據包時出錯了,那就要打ERROR了,因為這個是理論上不該出錯的地方,要不就是你的解析代碼有問題,要不就是開發人員在拼湊語音包時存在問題,這個時候需要你來找出問題的原因。所以應該打ERROR。

  2.WARN:

  WARN是指出現了不影響程序正確運行的問題,WARN也是問題但不影響程序正常運行,如果WARN出現的過於頻繁或次數太多,那就代表你要檢查一下程序或環境或依賴程序是否真的出問題了。

  假如你訪問一個接口,設置了一個超時,超時之后會拋異常,你在try塊里不該打ERROR也不該打INFO來無視它,這時你應該打WARN,緊緊是警告一下,如果超時過多那就該檢查一下了,是不是對方接口有問題了或者是網絡環境出問題了。

  3.INFO和DEBUG:

  ERROR和WARN是指有問題,而INFO和DEBUG就是指一般的信息了。在程序出問題時,如果這條log可以幫助你分析問題或查看程序的運行情況,那就應該打個INFO。如果僅僅是為了在調試階段查看程序是否運行正確那就要打DEBUG。前邊討論的接口參數錯誤問題,就應該打個INFO了,調用者說你的接口總是返回錯誤代碼,你可以告訴他,是他的哪個參數傳錯了。

 

  二.如何打

  1.log必備信息

  在每一條log中都要將時間、類名及函數名,可以的話將行號也打印出來(不建議手寫行號),像java的log4j就是不錯的。

  2.函數開始結束處

  在重要函數的開始結束出應該打上log ,這樣在看log時會比較直觀,什么時候開始什么時候結束就會一目了然,萬一中間出異常導致程序退出了,也知道是在哪個函數突然中斷的。也同樣適用於一個重要邏輯塊的開始結束。

  3.返回結果

  盡量在重要函數或web接口的每個返回分支打印返回結果。在出現不好分析的異常時,從細節下手,這時log會派上用場。如果跟合作方在數據方面出現爭議也可以及時拿出證據。

  4.添加Exception異常的捕獲

  如果你在代碼中捕獲了某種異常,那你要在try塊后添加Exception的捕獲,以防出現運行時異常中斷程序。

  5.務必打印堆棧信息

  在異常捕獲代碼中務必要將堆棧信息打印出來,否則打了那么多的log可能會功虧一簣。

  6.多線程的log

  在多線程的程序中,log最好要標記thredId,否則可能不知道是哪個線程的作業,也無法有條理的來觀察一個線程。

  7.成功失敗標志

  如果某個函數是做一件比較關鍵的事情,那么這件事情成功還是失敗了,要打印log,否則關鍵事件運行結果如何都拿不出證據的話,實在是不能讓人信服。

  8.前后log的關系

  如果是web程序或接口,那log就不是按照你預定的順序出現的,可能是好幾個響應的log穿插在一起的。代碼里如果有幾條log前后存在一定的數據關系,那么要將這幾條log的關聯信息打出來,用來確定是針對同一個響應的。如果沒有明確的標志,很難說后邊的log跟前邊的log是同一個響應或者是針對同一條數據。

  9.關於耗時

   訪問一個第三方接口、上傳下載文件等可能耗時的操作,都要記錄完成這個操作所耗的時間。否則程序性能出了問題,你不知道是網絡原因呢,還是你調用的第三方接口性能出現問題呢,還是你自己程序的問題呢。

  10.關於數量

   涉及到數量的操作要打印log,比如查詢數據庫和批量拷貝文件、上傳下載、批量格式轉換等批量操作,設計到的數量要打印出來。

 

  總之,打log的目的是為了迅速排錯或在有爭議時拿出證據證明自己。基於這個目的,log不在多,只要抓住一切對自己有利的信息,就可以了。

  想起其他的再繼續補充吧,歡迎大家拍磚補充。

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM