項目信息追蹤(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不在多,只要抓住一切對本身有利的信息,就能夠了。
  想起其餘的再繼續補充吧,歡迎你們拍磚補充。
  本人學識尚淺,寫文目的是爲了獲得你們指點。 假若文章幫到了您,那真是好極了。java

相關文章
相關標籤/搜索