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ī)則(最大文件、最多保存多少天),超過設定的值就刪除較早的記錄。