任何系統都有可能會出現問題,出現問題時我們的第一反應是為什么會出錯?出錯時發生了什么?如何復現?
如果你記錄了完善的日志,那么只要一看日志,你就能快速知道程序出現錯誤時究竟發生了什么,進而追溯到導致錯誤發生的原因,從而修復問題。
可以說一個日志記錄是一個完善的系統必不可少的一部分。本文簡單探討為什么記錄日志,怎么記錄日志以及記錄日志的方法。
應用層日志作用
總的來說,日志的根本作用是記錄必要的程序執行過程和狀態,以便於以后追溯和參考。
跟蹤調試
在很多特殊環境下,不能使用單步調試等方法實時知道程序的執行情況,這時就需要使用日志來記錄程序執行情況。
幫助開發人員或者測試人員知道程序執行的過程和狀態,進而完善程序和定位解決BUG等。
跟蹤排查錯誤
當錯誤發生時,我們需要知道當時的程序執行情況,比如執行到那一步,執行時的個變量狀態等。
我們需要通過對日志追蹤,獲取該錯誤發生時的具體執行環境,只有通過這些信息,我們才能分析出錯誤出現的原因,以及如何修正錯誤。
備案
另外,對於一些特別敏感信息的操作,比如涉及金錢的操作,需要記錄所有的流水日志,以供以后對賬等參考。
而且這些日志也能夠在系統出現問題時,恢復數據,降低經濟損失。
日志的分類
可以根據日志的用途對日志進行分類,也可以根據日志的必要性或者等級來進行分類,常用的分級方法依據日志的嚴重等級,如下:
TRACE
級:盡量詳細的信息,以便於開發過程中觀察,在開發完上線后應該被屏蔽,DEBUG
級:記錄用於調試過程中的一些必要信息,在開發完上線后應該被屏蔽INFO
級:記錄程序執行的關鍵步驟,在以后具有參考價值,在線上系統中有保留的價值WARN
級:屬於輕微的“警告”,記錄程序出現的異常情況,但是不影響正常使用ERROR
級:屬於“普通的錯誤”,在程序可以控制的范圍內,不會造成連鎖影響或巨大影響FATAL
級:屬於“致命錯誤”,可導致整個系統或者一系列功能無法使用,甚至導致系統癱瘓、關閉EMERG
級:屬於“災難”級,導致整個系統崩潰
其中TRACE
級和DEBUG
級的日志,只用於開發調試過程中,記錄信息所在空間大,應該在開發完成后關閉。
在很多系統中可以不用這么細致的分類,但是一個完善的日志系統最起碼包含三個以上基本基本的日志:
如可以只包含DEBUG
級,INFO
級,ERROR
級。
日志系統設計
在一個系統設計的前期,就應該規划好完善的日志記錄方案,因為日志記錄伴隨在系統開發的沒一個部分。
如果指靠在系統完成后在添加必要的日志記錄是不現實的。
明確日志記錄的目的
需要明確記錄的日志是什么樣的人使用:
- 開發人員需要使用的信息:
DEBUG
級等 - 運維人員需要知道的信息:
ERROR
級等 - 系統使用人員需要知道的信息:日志的輸出和反饋等
- 系統審計人員需要知道的信息:關鍵業務
INFO
級日志
針對不同的使用人員,我們還應該規划合適的日志記錄形式。
日志格式
隨着系統的運行,日志肯定是不斷增長的,為了以后能夠快速找到需要的日志,需要注意一下幾點:
- 善用日志分級,不濫用日志,不關鍵的日志應該在線上系統屏蔽
- 為不同的日志總類添加標簽,以便快速查找特定類型日志
- 按照日期分類,一方面便於日志轉存,另外也助於快速定位日志
- 日志應該有相對標准的格式,比如json,序列化等,以便於查找關鍵信息
總的來說,日志的記錄一定是為了以后的追蹤和讀取,應充分考慮到以后獲取日志的情形。
日志記錄應注意的問題
- 性能損耗:日志記錄不應過於頻繁,應考慮到日志記錄到來的系統性能損耗
- 安全性:不在日志中記錄涉及安全的敏感信息,如在日志中記錄用戶密碼是絕對禁止的
- 時效性:應該定期清理沒有參考意義的日志,避免日志積累過多占用系統存儲空間
日志的存儲方式
常見的日志存儲系統如下:
- 系統自帶文件系統
- 分布式文件存儲系統
- Mysql數據庫
- Mongodb數據庫
無論是哪一種存儲方式,都要考慮到以后查詢日志的遍歷性,日志存儲的性能損害,日志的用途等。
在一些需要對日志進行大數據分析的場景,還需要把日志轉存到HDFS等專門的環境中。
實際應用
在不同的業務場景,需要記錄的日志內容是千差萬別的,但是它們的本質一定是為了之后的追溯使用。
在想Java,PHP等實際語言的開發中,可以為一個系統封裝一個統一的入口Log日志記錄類。
在這個Log類中規定統一的日志格式以及各種不同的日志記錄級別,還可以在這個類中附加額外的信息等。
絕對避免在系統中隨意記錄日志。
原文更新至:< http://uusama.com/875.html>