Node.js 日志最佳實踐指南

在 JavaScript 開發過程中,很多時候使用 console.log 來調試程序,算是比較常用的一個方法。
在開發階段,無論是日志記錄還是調試,都可以很容易地跟蹤程序并檢測到錯誤。但是在生產環境中,應該考慮更多關于日志記錄的問題,因為這對于應用程序的監視和故障排除非常關鍵。
曾經寫過一篇文章《淺談前端異常監控平臺實現方案》提到過異常捕獲是改善軟件質量的跟蹤手段之一,常見的方式是記錄日志。本文將介紹 Node.js 日志相關概念,并介紹比較受歡迎的日志腳本庫。
關于日志記錄
志記錄是將應用程序運行生成的信息記錄到日志文件中的過程,保存在日志文件中的記錄稱為日志,日志是一種保存應用程序信息的簡單方法。
日志是程序員追蹤錯誤和事件流的首選方式,過去在服務器端程序開發中常用,而現在對于 WEB 前端來說也是必不可少。
對于前端開發,在開發過程中跟蹤錯誤時,通常會使用 console.log 或 debugger 。
但是當應用程序進入生產環境并且用戶開始與其交互時,就不能再使用 console.log。如果出現問題并且應用程序崩潰,也無法使用控制臺獲知。
這就是為什么需要一個簡潔、干凈、高效率的日志記錄框架。相反,通過提供日志事件的實時流,這些日志可以用于實時診斷異常、惡意軟件活動或未經授權的資源訪問。
因此,日志將使開發人員、DevOps、SysAdmins或SecOps更容易了解和識別應用程序和基礎設施問題的根源。
日志等級
這是任何日志系統中最重要的部分。日志等級是日志的元數據,該等級定義了記錄事件信息的嚴重程度。首先設置日志等級的原因是為了可以快速查看哪些日志需要更多關注。通常日志等級有 5 個主要的等級,根據優先級排列如下:
ERROR:處理當前操作時發生了嚴重的問題/失敗,此類日志是需要盡快處理的。WARN:警告等級,并沒有阻止應用程序繼續,當檢測到意外的應用程序問題時會發出告警日志。對于這個等級的日志一般檢查一下以決定是否應該解決。INFO:應用程序的正常行為DEBUG:這個等級是為開發人員準備的,它以詳細的方式提供診斷信息,通常用于獲取診斷、故障排除或測試應用程序所需的信息。TRACE:捕獲有關應用程序行為的所有詳細信息,主要用于詳細跟蹤應用程序邏輯。
注意:通常日志記錄器的正常行為都只跟蹤當前等級和以上等級的日志。因此,如果將日志等級設置為
INFO,則只會得到INFO、WARN和ERROR級別的日志信息。
最佳原則
對于日志記錄系統,通常都應該遵守以下 5 個基本原則:
1. 記錄有意義和目的
不要添加不必要的日志,因為多余的日志信息會變成噪音。另外如果應用程序寫日志的頻率過高,將直接影響應用程序的性能。
注意:除非代碼庫有問題,否則就不應該在生產環境中啟用
DEBUG或TRACE等級的日志。(解決問題后,確保將其切換回INFO或ERROR級別。)
2. 進行分割,避免造成大日志文件
如果對日志不進行分割,將會導致日志文件非常大,在分析時會很麻煩。同時對于文件日志來說,文件過大也將影響性能。可以為單獨的日志等級使用單獨的日志文件,或者可以嘗試使用大多數日志框架中可用的滾動日志文件特性。根據時間或大小對日志文件進行分割壓縮。
3. 應該按層次進行
正如上面介紹的,應該根據優先級等級處理日志。這將有助于在很短的時間內分析日志并發現問題。
另外,使用日志名稱空間保持內容整潔,日志時間戳是日志信息必不可少的關鍵信息。
4. 不應該有副作用
這里說的副作用是指日志記錄不能影響應用程序本身,不能因為日志記錄導致嚴重的程序問題。
5. 不能記錄任何敏感信息
在登錄時,必須確保沒有記錄任何敏感信息,如用戶登錄名和密碼、身份證、手機號碼、銀行卡號等。
上面 5 條是一個日志記錄系統應該遵守的最低原則。下面介紹幾個可以用于日志記錄的框架,避免重復造輪子,提高效率。這些是 NPM 上可用的最流行的日志庫:
- Winston :靈活的通用日志庫
- Morgan : HTTP請求記錄器中間件
- Pino:超快(非常低的開銷),純原生 JSON 記錄器
- Loglevel:JavaScript最小的輕量級簡單日志記錄
- log4js :沒有運行時依賴的日志框架
總結
本文介紹了 Node.js 中日志相關概念,并介紹了 npm 上比較受歡迎的 5 個腳本庫,有些腳本庫可以支持多種語言和環境。現在的應用及平臺業務邏輯都相對比較復雜,需要日志系統為其提供更好的服務,服務于應用及平臺的改造、體驗和升級。