日志打印最佳實(shí)踐
標(biāo)題為什么要記錄日志?
打印調(diào)試:用日志來記錄變量或者某一段邏輯,記錄程序運(yùn)行的流程,即程序運(yùn)行了哪些代碼,方便排查邏輯問題。
問題定位:程序出異?;蛘叱龉收蠒r快速的定位問題,方便后期解決問題。因?yàn)榫€上生產(chǎn)環(huán)境無法debug,在測試環(huán)境去模擬一套生產(chǎn)環(huán)境費(fèi)時費(fèi)力。所以依靠日志記錄的信息定位問題,這點(diǎn)非常重要。
監(jiān)控告警 & 用戶行為審計(jì):格式化后日志可以通過相關(guān)監(jiān)控系統(tǒng)(AntMonitor)配置多維度的監(jiān)控視圖,讓我們可以掌握系統(tǒng)運(yùn)行情況或者記錄用戶的操作行為并對日志采集分析,用于建設(shè)業(yè)務(wù)大盤使用
什么時候記錄日志?
代碼初始化時或進(jìn)入邏輯入口時 :系統(tǒng)或者服務(wù)的啟動參數(shù)。核心模塊或者組件初始化過程中往往依賴一些關(guān)鍵配置,根據(jù)參數(shù)不同會提供不一樣的服務(wù)。務(wù)必在這里記錄INFO日志,打印出參數(shù)以及啟動完成態(tài)服務(wù)表述。
編程語言提示異常:這類捕獲的異常是系統(tǒng)告知開發(fā)人員需要加以關(guān)注的,是質(zhì)量非常高的報錯。應(yīng)當(dāng)適當(dāng)記錄日志,根據(jù)實(shí)際結(jié)合業(yè)務(wù)的情況使用WARN或者ERROR級別。
業(yè)務(wù)流程預(yù)期不符:項(xiàng)目代碼中結(jié)果與期望不符時也是日志場景之一,簡單來說所有流程分支都可以加入考慮。取決于開發(fā)人員判斷能否容忍情形發(fā)生。常見的合適場景包括外部參數(shù)不正確,數(shù)據(jù)處理問題導(dǎo)致返回碼不在合理范圍內(nèi)等等。
系統(tǒng)/業(yè)務(wù)核心邏輯的關(guān)鍵動作:系統(tǒng)中核心角色觸發(fā)的業(yè)務(wù)動作是需要多加關(guān)注的,是衡量系統(tǒng)正常運(yùn)行的重要指標(biāo),建議記錄INFO級別日志。
第三方服務(wù)遠(yuǎn)程調(diào)用:微服務(wù)架構(gòu)體系中有一個重要的點(diǎn)就是第三方永遠(yuǎn)不可信,對于第三方服務(wù)遠(yuǎn)程調(diào)用建議打印請求和響應(yīng)的參數(shù),方便在和各個終端定位問題,不會因?yàn)榈谌椒?wù)日志的缺失變得手足無措。
日志格式一般需包含以下幾類關(guān)鍵信息:
調(diào)用時間
日志鏈路id(traceId、rpcId)
線程名
接口名
方法名
調(diào)用耗時
調(diào)用是否成功(Y/N)
錯誤碼
系統(tǒng)上下文信息(調(diào)用系統(tǒng)名、調(diào)用系統(tǒng)ip、調(diào)用時間戳、是否壓測(Y/N))
2022-12-12 06:05:05,129 [0b26053315407142451016402xxxxx 0.3 - /// - ] INFO [SofaBizProcessor-4-thread-333] - [(interfaceName,methodName,1ms,Y,SUCCESS)(appName,ip地址,時間戳,Y)
詳細(xì)日志
詳細(xì)日志是用于補(bǔ)充摘要日志中的一些業(yè)務(wù)參數(shù)的日志文件,用于問題排查。詳細(xì)日志一般包含以下幾類信息:
調(diào)用時間
日志鏈路id(traceId、rpcId)
線程名
接口名
方法名
調(diào)用耗時
調(diào)用是否成功(Y/N)
系統(tǒng)上下文信息(調(diào)用系統(tǒng)名、調(diào)用系統(tǒng)ip、調(diào)用時間戳、是否壓測(Y/N))
請求入?yún)?請求出參
2022-12-12 06:05:05,129 [0b26053315407142451016402xxxxx 0.3 - /// - ] INFO [SofaBizProcessor-4-thread-333] - [(interfaceName,methodName,1ms,Y,SUCCESS)(appName,ip地址,時間戳,Y)(參數(shù)1,參數(shù)2)(xxxx)
日志記錄原則
隔離性:日志輸出不能影響系統(tǒng)正常運(yùn)行;
安全性:日志打印本身不能存在邏輯異?;蚵┒?,導(dǎo)致產(chǎn)生安全問題;
數(shù)據(jù)安全:不允許輸出機(jī)密、敏感信息,如用戶聯(lián)系方式、身份證號碼、token等;
可監(jiān)控分析:日志可以提供給監(jiān)控進(jìn)行監(jiān)控,分析系統(tǒng)進(jìn)行分析;
可定位排查:日志信息輸出需有意義,需具有可讀性,可供日常開發(fā)同學(xué)排查線上問題。
打印日志要點(diǎn)
1.防止NPE
2.禁止使用 System.out.println()輸出日志
原因: 此打印日志為控制臺日志 , 并且是同步方法,高并發(fā)情況會影響性能 , 而且無法對日志統(tǒng)一收集
3.應(yīng)用中不可直接使用日志系統(tǒng)(Log4j、Logback)中的API,而應(yīng)依賴使用日志框架 (SLF4J、JCL–Jakarta Commons Logging)中的API。
原因: 日志系統(tǒng)需要與代碼解耦
4.聲明日志工具對象Logger應(yīng)聲明為private static final
原因: private 防止日志對象被其它類非法使用
static 防止重復(fù)new日志對象,防止被序列化 , 減少安全風(fēng)險
final 在類的生命周期無需變更logger,避免程序運(yùn)行期對logger進(jìn)行修改。
5.捕獲異常后不要使用e.printStackTrace()打印日志
原因: e.printStackTrace()語句產(chǎn)生的字符串記錄的是堆棧信息,如果信息太長太多,字符串常量池所在的內(nèi)存塊沒有空間了,即內(nèi)存滿了,系統(tǒng)請求將被阻塞。
6.不要打印無意義(無業(yè)務(wù)上下文、無關(guān)聯(lián)日志鏈路id)的日志
7.日志打印禁止使用JSON打印對象 , 應(yīng)使用 toString() 方法或者apache的ToStringBulider
8.禁止打印敏感信息
9.日志打印盡量使用英文
原因: 盡量在打印日志時輸出英文,防止中文編碼與終端不一致導(dǎo)致打印出現(xiàn)亂碼的情況,對故障定位和排查存在一定的干擾。文章來源:http://www.zghlxwxcb.cn/news/detail-435424.html
10.調(diào)用第三方接口一定需要打印出入?yún)?span toymoban-style="hidden">文章來源地址http://www.zghlxwxcb.cn/news/detail-435424.html
到了這里,關(guān)于日志打印最佳實(shí)踐的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!