写程序时如何使用日志
本文來自于朋友tzz的日常編程心得。
日志分級
6個日志等級:TRACE/DEBUG/INFO/WARNING/ERROR/FATAL
為了更好的使用日志系統,需要清楚的知道每個日志級別的功能定位和特點。
默認輸出標準:
終端:DEBUG(含DEBUG)級別以上日志會被實時輸出到終端(標準輸出)。
默認情況下,TRACE不打印到終端。
文件:INFO(含INFO)級別以上日志會被歸檔到日志文件。
默認情況下,TRACE和DEBUG均不記入日志文件。
TRACE
TACE的主要使用目的是在線調試。
該級別日志,默認情況下,既不打印到終端也不輸出到文件。此時,對程序運行效率幾乎不產生影響。
在程序運行過程中,如果需要查看TRACE級別日志,需要通過elog命令開啟TRACE或者將程序日志輸出級別降至TRACE。
.
DEBUG
DEUG的主要使用目的是終端查看和在線調試。
該級別日志,默認情況下會打印到終端輸出,但是不會歸檔到日志文件。因此,一般用于開發者在程序當前啟動窗口上,查看日志流水信息。
在程序啟動命令行中加入 “-nostdout” ,將關閉所有前端打印輸出(主要針對DEBUG級別日志)。
.
INFO
INFO的主要使用目的報告程序進度和轉態信息。一般這種信息都是一過性的,不會大量反復輸出。例如:連接商用庫成功后,可以打印一條連庫成功的信息,便于跟蹤程序進展信息。
該級別日志,默認情況下會同時打印到終端和歸檔到日志文件(下同)。
.
WARNING
警告信息,表明程序處理中遇到非法數據或者某種可能的錯誤,該錯誤是一過性的、可恢復的,不會影響程序繼續運行,程序仍處在正常狀態。
.
ERROR
該錯誤發生后程序仍然可以運行,但是極有可能運行在某種非正常的狀態下,導致無法完成全部既定的功能。
.
FATAL
致命的錯誤,表明程序遇到了致命的錯誤,必須馬上終止運行。
日志輸出注意事項
1.規范錯誤碼
函數返回值:
函數返回值盡量作為錯誤碼標識,不建議返回出參,如用于對象指針、記錄條數等信息的輸出。除帶有是否判斷意義的函數外,應采用int類型表示錯誤碼,不建議采用bool類型。
正確情況:
返回碼必須為0 值
錯誤情況:
返回碼必須為 小于0 值,建議對于典型錯誤進行編碼(而不是一律-1)。
對于錯誤情況,要記錄相關日志。
.
2.如何選擇日志級別
考慮因素:1)輸出頻率 2)嚴重級別
?輸出頻率
對于高頻輸出的日志,一定要用log_trace,否則嚴重影響程序執行效率、日志文件很快就會被打滿和覆蓋。因此,For、while循環中的日志,一定要用log_trace()
?嚴重級別
執行錯誤:必須采用log_warn()以上級別輸出。
非執行錯誤信息: 如調試、追蹤等日志信息,一定采用log_info以下級別打印,建議采用log_trace或者log_debug。
log_info只適用于輸出頻率不高的情況或者需要記錄到日志文件中,便于問題追憶的需求。
.
3.哪些信息需要記日志
1)異常、錯誤信息
2)調試、追蹤信息,具體包括:
函數入參:與其他模塊交互的程序(接口函數),最好采用log_debug記錄“輸入參數”信息,便于問題分析。
執行步驟:對于關鍵功能函數,應該劃分執行步驟,在每一步成功執行后,采用log_trace/log_debug記錄,便于跟蹤和掌控程序當前執行情況。
數據流:例如scada從fes接收到的采集數據相關信息。
.
4.日志信息應該包含哪些信息
對于錯誤、異常情況,應盡量記錄盡可能多的“上下文環境”信息.
如果是函數調用失敗,日志中必須包含返回值信息、以及函數調用的相關參數信息。
任何程序在返回錯誤碼前,一定要通過日志記錄具體的錯誤原因,并給出盡量多的場景信息。
.
舉例:一條典型的失敗的日志記錄:
int retCode = obj.func(para1,para2);
if(retCode < 0)
{
log_error(“obj func error.”);
return retCode;
}
總結
以上是生活随笔為你收集整理的写程序时如何使用日志的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: TB67S109AFTG采样电阻阻值怎么
- 下一篇: 在Windows上部署NTP Serve