程序員怎樣做出優秀的日志?
謝邀!要做出優秀的日志,必須要考慮以下幾個方面的事情:
1、日志的級別一定要搞清楚
ERROR
ERROR是最高級別錯誤,反映系統發生了非常嚴重的故障,無法自動恢復到正常態工作,需要人工介入處理。系統需要將錯誤相關痕跡以及錯誤細節記錄ERROR日志中,方便后續人工回溯解決。
WARN
WARN是低級別異常日志,反映系統在業務處理時觸發了異常流程,但系統可恢復到正常態,下一次業務可以正常執行。但WARN級別問題需要開發人員給予足夠關注,往往表示有參數校驗問題或者程序邏輯缺陷,當功能邏輯走入異常邏輯時,應該考慮記錄WARN日志。
INFO
INFO日志主要記錄系統關鍵信息,旨在保留系統正常工作期間關鍵運行指標,開發人員可以將初始化系統配置、業務狀態變化信息,或者用戶業務流程中的核心處理記錄到INFO日志中,方便日常運維工作以及錯誤回溯時上下文場景復現。
DEBUG
DEBUG日志是INFO日志的好幫手,開發人員可以將各類詳細信息記錄到DEBUG里,起到調試的作用,包括參數信息、調試細節信息、返回值信息等。其它等級不方便顯示的信息都可以通過DEBUG日志來記錄。
2、記錄日志的時機,一定要仔細考量
在排除故障的時候,該要出現的日志沒有,無用的日志一大堆,或者需要的信息分散在各個角落,特別是遇到緊急的在線bug時,有效的日志被大量無意義的日志信息淹沒,焦急且無奈地浪費大量精力查詢日志。那什么是記錄日志的合適時機呢?
當方法或者功能處理過程中產生不符合預期結果或者有框架報錯時可以考慮使用,常見問題處理方法包括:
“增加判斷處理邏輯,嘗試本地解決 拋出異常,交給上層邏輯解決 記錄日志,報警提醒 使用返回碼包裝錯誤做返回”
DEBUG級別。 系統初始化:系統或者服務的啟動參數。核心模塊或者組件初始化過程中往往依賴一些關鍵配置,根據參數不同會提供不一樣的服務。務必在這里記錄INFO日志,打印出參數以及啟動完成態服務表述。
編程語言提示異常:如今各類主流的編程語言都包括異常機制,業務相關的流行框架有完整的異常模塊。這類捕獲的異常是系統告知開發人員需要加以關注的,是質量非常高的報錯。應當適當記錄日志,根據實際結合業務的情況使用WARN或者ERROR級別。
業務流程預期不符:除開平臺以及編程語言異常之外,項目代碼中結果與期望不符時也是日志場景之一,簡單來說所有流程分支都可以加入考慮。取決于開發人員判斷能否容忍情形發生。常見的合適場景包括外部參數不正確,數據處理問題導致返回碼不在合理范圍內等。
系統核心角色,組件關鍵動作:系統中核心角色觸發的業務動作是需要多加關注的,是衡量系統正常運行的重要指標。建議記錄INFO級別日志,比如電商系統用戶從登錄到下單的整個流程;微服務各服務節點交互;核心數據表增刪改;核心組件運行等,如果日志頻度高或者打印量特別大,可以提煉關鍵點INFO記錄,其余酌情考慮
3、日志也會消耗性能,要牢記性能意識,不要隨意浪費資源
所有的日志工具,在日志輸出時總會對性能產生或多或少的影響,為了將影響降低到最低,有以下幾個準則需要遵守:
根本原則:有必要才記錄日志,頻繁過量日志對性能是有損耗的,并且這種風險不常在系統正常時出現,系統出現問題時大量ERROR、INFO等問題相關日志有可能產生連鎖反應,造成嚴重的后果。將關鍵信息保存到日志,同時考慮極端場景日志爆發。
Logger獲取:根據系統使用的日志框架組合,確定正確的實例獲取方式。在log4j的早期版本,一般要求使用static,而在高版本以及后來的slf4j等一些框架封裝中,該問題已經得到優化,獲取(創建)logger實例的成本已經很低。但對于多例,尤其是需要頻繁創建的class,推薦添加static前綴。
輸出等級校驗:在log4j 1.x版本,對于可以預見的會頻繁產生的日志輸出,先判斷一下(logger.isXXXEnabled(),對于性能有很大提升,在其它外觀框架或者log4j 2.x中已經自動實現。 輸出格式:禁止使用字符串拼接,使用參數方式。 樣式配置:布局配置輸出的信息也會影響到性能,需要根據logger的具體使用場景來選擇輸出合適信息。
核心都是減少日志量 ,前兩點偏向設計,后四點偏向日志框架及習慣,并且這四點目前一些框架組合已經能幫開發人員減少不少工作,比如log4j2.x在實例獲取,輸出等級判斷都有優化。