前言
剛開始工作的時候,常常在Code review的時候因為沒寫Log或寫的方式錯誤常常被念,那時候逢人就問,什麼時候要寫Log?
但回應大概八成都是
- 想寫的時候就寫
- 你想記錄事情的時候
直到後來多接觸了些可觀測性的議題,以及開始整理Log後才慢慢對這部分有比較基礎的認識,也因此產生了這篇廢文。
不免俗地來個基本介紹,Log分為以下幾種等級,依照嚴重性來寫Log的級別是非常重要的,所以微軟官方也有依嚴重性給了一些準則,這邊我就把內容搬進來
- Trace 包含最詳細的訊息。 這些訊息可能包含敏感性應用程式資料。 這些訊息預設會停用,且不應在生產環境中啟用。
- Dubug 用於偵錯和開發。 由於大量,因此在生產環境中請謹慎使用。
- Information 追蹤一般應用程式流程。 可能具有長期值。
- WARN 針對異常或意外事件。 通常包含不會導致應用程式失敗的錯誤或狀況。
- ERROR 發生無法處理的錯誤和例外狀況。 這些訊息指出目前作業或要求中發生失敗,而不是整個應用程式的失敗。
- Critical(一般對應FATAL) 發生需要立即注意的失敗。 範例:資料遺失情況、磁碟空間不足。
如果覺得看起來不懂,提供一下我的理解懶人包,但我不負任何責任
- Trace 正式環境不要用,你也可以把內容記好記滿但我預設不啟用。
- Dubug 正式環境不要用,除非你要在正式環境Debug。
- Information 最基本的Log級別。
- WARN 不會導致應用程式失敗的錯誤或狀況。 欸居然出現WARN了???但不急,我來來看看是為什麼
- ERROR 出事啦!!!確認一下原因看有沒有辦法改善,分析嚴重性和後續處理。
- Critical(一般對應FATAL) 睡覺也要跳起來,如果沒有即時處理,離職信就該擬一下了QQ
在appsetting.json這設定檔裡面,可以調整要紀錄的層級,以避免在不對的環境記錄太多Log導致產生效能問題,也可以在正式環境有狀況但沒頭緒時短時間把紀錄Log的層級降低來獲得更多資訊,是一個很彈性的設定方式。
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
目前比較常看到的Log等級是Information、WARN、ERROR,其他像是Trace、Dubug、FATAL相對之下比較少,我的理解是Trace和Debug雖然可以關掉,但如果寫太大量的話會造成程式的可讀性問題,在維護時會被干擾,而FATAl這種錯誤本身就不太該發生也不太可控,所以很少看到是當然的,但很有可能是我經驗太不足了XD
知道Log的等級後,那接下來就是有哪些東西是應該寫的? 這邊的範圍是系統層級,但縮小到Web之中也是一樣的概念
- 系統紀錄 紀錄系統開始、關閉、更新等最外層的資訊,以Web來說,就是記錄著Host的啟動和結束
- 應用程式紀錄 在程式中發生的事情,記錄一般的流程,主要目的是讓你知道前後發生了什麼事情
- 效能紀錄 系統本身的資源使用率,在網站上比較常發生的是想知道這個Function實際上跑了多久
- 安全紀錄 在系統上會記錄取得並使用管理者權限時進行讀取作業,在網站上也是,當有人登入了權限很大的帳號也應該要記錄。
- 訪問記錄 在系統上會知道誰來看我們,甚至系統上的硬碟和文件都有自己的紀錄,在網站就是記錄著request的相關資訊,可以從這些資料分析來改善網站,也可以記錄一些IO操作的的訪問記錄
- 審核紀錄 在系統上紀錄一些重要操作和事件的內容,網站的話就像使用者登入登出、修改資料,request裡面的原始資料等等,會叫審核紀錄,就是為了監察系統有沒有存在什麼違規的活動。
- 想寫什麼就寫什麼 如果團隊有特定的規定或規範通常就會在這邊
到這邊就告一段落啦,整理完才發現原來平常寫的Log是屬於哪一個種類的,雖然看起來分得很細,但實際上真的都是些會想記錄的內容,難怪大家都這樣說了 :laughing: