日志系統(tǒng)設計

1. 什么是日志?

在我們項目中,使用日志來記錄整個系統(tǒng)的運行情況??赡艿遣幌抻冢?/p>

HTTP 請求數(shù)據(jù)
數(shù)據(jù)庫 SQL 請求日志
Panic/Error 錯誤日志
請求第三方接口日志(發(fā)送短信、發(fā)送郵件等)

2. 日志的目的

記錄日志的目的是什么?

方便調試,快速精準地幫我們定位問題。

3. 使用場景

本地開發(fā): 本地開發(fā)時,雖然我們可以很方便的使用 Debuger 來調試程序,但是日志將會是我們最廉價、最便捷的錯誤定位工具。
線上環(huán)境: 日志是程序在生產環(huán)境下的健康監(jiān)控。當程序出錯時,或者某塊業(yè)務邏輯出現(xiàn)問題,我們將依賴日志來知道具體哪一行代碼出了問題。

4. 日志的等級

我們的日志系統(tǒng),會劃分四個等級:

日志等級 說明
debug 信息量大,一般調試時打開。系統(tǒng)模塊詳細運行的日志,例如 HTTP 請求、數(shù)據(jù)庫請求、發(fā)送郵件、發(fā)送短信
info 業(yè)務級別的運行日志,如用戶登錄、用戶退出、訂單撤銷。
warn 感興趣、需要引起關注的信息。 例如,調試時候打印調試信息(命令行輸出會有高亮)。
error 記錄錯誤信息。Panic 或者 Error。如數(shù)據(jù)庫連接錯誤、HTTP 端口被占用等。一般生產環(huán)境使用的等級。

日志等級規(guī)則:

  • 日志等級在兩個地方使用;
    • 配置信息(config/log.go)中可以配置日志等級;
    • 代碼中調用不同的方法(Debug()、Info()…)記錄不同等級的日志。
  • 日志等級具備過濾信息的屬性;
    • 配置信息里設置為高等級時,低于這個等級的信息將忽略。如日志等級設為 warn ,只有 Warn() 和 Error() 方法記錄的日志會有效,Debug() 和 Info() 方法記錄的日志會被忽略;

5. 小心日志過載

記錄日志的行為完全掌控在開發(fā)者手上。日志等級的錯誤使用,會導致日志信息過載,有違『快速定位問題』的設計初衷。
所以記錄日志時,參與項目的開發(fā)者之間需要做好約定,或者說規(guī)范。

功能模塊的詳細運行情況,使用 Debug() 方法,如 HTTP 請求日志、數(shù)據(jù)庫 SQL 日志;
業(yè)務級別的運行日志,使用 Info(),如果信息量太大,例如說一個請求會記錄十幾條 Info() 日志,要改用 Debug();
控制好記錄日志的量,切勿濫用,濫用會導致日志信息過載;
開發(fā)調試時,使用 Warn() ,調試完成后記得刪除調試信息;
保持 warn 及以上日志級別的干凈;
線上環(huán)境開啟 error 等級,接到錯誤反饋時,再開啟 debug 進行調試,調試完成后重新設置為 error 等級,保持線上日志的干凈;

ERROR等級說明

系統(tǒng)運行出錯,才能使用 Error() 記錄,如數(shù)據(jù)庫連接出錯,或出現(xiàn) 500 錯誤。
切勿將 error 級別與 Go 語言的 error 類型畫上等號

例如解析用戶請求的 JSON 數(shù)據(jù)出錯時,會返回 Go 的 error 類型:

func (c *Context) ShouldBind(obj interface{}) error
應當回饋給 API 422 狀態(tài)碼(無法處理請求),記錄一條 warn 的日志,而不是 error 等級的錯誤日志。

另一個例子是 Gorm 查詢數(shù)據(jù)庫,未找到數(shù)據(jù)時會返回自定義的 Error ,此時應該記錄為 warn 或者 info ,而不應該記錄為 error 等級的錯誤日志。

6. 記錄日志的方式

從日志的使用場景出發(fā),有兩種記錄日志的方式:

使用環(huán)境 記錄的載體 說明
開發(fā)環(huán)境(local) 命令行終端 高亮、打印調用堆棧
線上環(huán)境(production) 記錄到日志文件 JSON 格式,方便導入專業(yè)的日志工具

7. 日志分割

日志可設置單文件或者按照日期劃分日志文件。

單文件:
storage/logs/log.log

日期分隔:
storage/logs/2021-12-30.log
storage/logs/2021-12-31.log
storage/logs/2022-01-01.log
storage/logs/2022-01-02.log
storage/logs/2022-01-03.log

8. 滾動日志(rolling log)

滾動日志的目的是防止單個日志文件過大,以至于占滿硬盤空間。
滾動日志的原理是通過設定的規(guī)則(最大文件、最多保存多少天),超過設定的值就刪除較早的記錄。

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容