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