程式設計師如何科學地記日誌
無論是哪種程式設計師,日常開發中都離不開記日誌。但是通過最近的review會,發現很多程式設計師在記日誌的時候,還是會有些問題。那麼如何科學地記錄日誌呢?
為什麼要記日誌
在尋求方法前,我們先看看我們記日誌的目標。
日誌是程式執行時的x光,能夠追蹤到程式執行的狀態,通過日誌,程式設計師能夠加速除錯速度,還原異常情況出現的場景。
也有通過日誌記錄處理資料,方便後面統計和審計。
還有通過日誌進行備份,當資料有問題時,通過日誌恢復資料。
總之,我們記日誌,是為了給人看,來了解程式執行的狀態。今天我們只講日常除錯和發現異常的場景。
日誌記錄什麼內容
既然日誌是給人看的,就要讓人能讀懂,給出足夠的資訊。要帶有上下文,4w都要清晰。把日誌記錄時刻的時間when、地點where(發生的函式,程式碼行)、什麼資料或請求導致(who)。通過這些我們推出why,和how。知道為什麼會記錄成這樣,有什麼影響。
日誌的級別
在程式中,日誌也是分級別的,不同的級別表示日誌的不同場景和用途。
通常有如下級別:
TRACE:列印最詳盡,在開發過程中使用此級別。類似於單步除錯,在發不到運營環境後應該遮蔽掉這個級別。
DEBUG:指出細粒度資訊事件對除錯應用程式是非常有幫助的,主要用於開發過程中列印一些執行資訊。
INFO:訊息在粗粒度級別上突出強調應用程式的執行過程。列印一些你感興趣的或者重要的資訊,這個可以用於生產環境中輸出程式執行的一些重要資訊,但是不能濫用,避免列印過多的日誌。
WARN: 表明會出現潛在錯誤的情形,有些資訊不是錯誤資訊,但是也要給程式設計師的一些提示。
ERROR: 發生了錯誤事件,但仍然不影響系統的繼續執行。列印錯誤和異常資訊,需要記錄後處理。
FATAL: 指出每個嚴重的錯誤事件將會導致應用程式的退出。嚴重錯誤,直接停止程式。
每一條日誌都是以上級別中的一種,程式中通過配置預設列印的級別,控制哪些語句列印,哪些不列印。
一般開發階段使用DEBUG級別,線上運營階段使用INFO或WARN級別。
注意事項
控制好日誌的量
記錄日誌是旁路邏輯,和給使用者使用的邏輯是互不影響的。但是日誌會消耗程式效能,搶佔給使用者的計算機資源。所以在記錄日誌時,要控制好日誌的量,不要因為記錄日誌而導致效能下降。
有些同學會覺得,我的業務現在量也不大,多記些日誌也沒什麼。勿以善小而不為。要養成好的習慣,如果沒有這種意識,是沒有機會做大業務量的程式的。即使有,也會出問題。
即使量少,使用者少,但是不保證程式執行的次數少。如果有個迴圈頻繁呼叫,觸發記錄日誌,也會導致出問題的。我就見過日誌記錄太多,把cpu給佔滿,機器連ssh都連不上。
日誌中出現太多的特殊字元
看到有的同學在日誌裡,會寫些特殊的字串,例如「XXXXXXXXXX」。原因是為了好搜尋。如果是為了解決號搜尋的問題,使用有規則的格式,和有意義的名字是不是更好,把程式碼行號打進去是不是更容易搜尋?而且大家還知道是什麼意思。
注意日誌級別
一種是把DEBUG級別設定到生產環境。還有一種是在程式碼中沒有日誌級別的概念,都用一種級別,DEBUG或者ERROR。要麼所有的日誌在生產環境都打不出來,要麼一下子全打出來了。
注意日誌安全
既然日誌記錄了這麼多資訊,要注意日誌中的內容,不能什麼都打。和使用者隱私相關的要避免列印到日誌中去。因為這些資訊如果不影響查詢bug,記錄後容易洩露使用者隱私。例如:使用者的聊天記錄、使用者的金鑰、使用者的電話號碼郵箱等。
日誌可讀性
儘量用英文,儘量少用中文,防止機器或網頁有字元問題,造成不必要的查詢麻煩。
幾種有效的日誌形式
以下這幾種記錄日誌的形式都各有所長,值得大家學習。但是切記,都有好用的日誌庫,千萬別自己實現,裡面的水很深。
記憶體日誌
既然日誌列印很耗費效能,一般是磁碟IO是瓶頸。但是在程式遇到問題時,還想把從程式開始,到出問題這段時間的日誌都記錄下來,怎麼辦呢?就用記憶體日誌。
申請一個共享記憶體變數,在程式的各個執行節點,都把要記錄的日誌資訊儲存在這個變數中。當程式出錯,或者要crash後。用工具把這段記憶體dump下來,相當於一些棧資訊打印出來。如果程式執行正常,當新的請求再開始執行時,重新清空變數,再繼續記錄。
既記錄了很多資訊,有沒有造成IO的花銷,在尋找C++後臺程式core的原因時是非常有用的一種方式。
遠端日誌
既然打本機日誌耗費IO效能,導致cpu使用率飆升。那麼通過網路包,把資訊傳送給遠端,儘量減輕本地記錄日誌負擔。這也是一種好方法。遠端有專門處理日誌的程式,負責給日誌入庫,進行分析和索引。
染色日誌
當有使用者反饋遇到問題時,但發現只是個例,其他使用者並沒有此問題時。可以給反饋問題的使用者「染色」。日誌程式在寫日誌時,只對染色的使用者進行記錄,其他的不記。
流水日誌
一般用於寫介面,把每次寫的原始引數給記下來。通過這些流水日誌,能夠恢復出記錄的資料,用於備份或對賬最終資料,或者提供給其他系統重寫資料。
總結
日誌是給人看的,要注意可讀性。
寫日誌時要注意不要影響程式效能,按需而記。
日誌在軟體維護期間使用的最多,不要日誌用時方恨少。