业务系统日志记录规范总结
業(yè)務(wù)系統(tǒng)日志記錄規(guī)范
注意
日志級(jí)別 trace 和 debug
測(cè)試環(huán)境要實(shí)現(xiàn)的目標(biāo)是,不需要重新完整的調(diào)試程序,可以直接定位到出問題的 service 內(nèi)的邏輯分支,最多在進(jìn)行一次小范圍的測(cè)試;
要實(shí)現(xiàn)這個(gè)目標(biāo),需要記錄 service 入?yún)⒊鰠?#xff0c;debug級(jí)別的日志,只在非生產(chǎn)環(huán)境中使用;
日志級(jí)別 info
日志級(jí)別 warn
日志級(jí)別 error
error 級(jí)別只記錄系統(tǒng)邏輯出錯(cuò)、異常或者重要的錯(cuò)誤信息。
異常在程序中,一般會(huì)沿著調(diào)用鏈路,層層上拋,直到service層,在最終處理異常的地方記錄log.error(e);log.error和往外拋異常,不應(yīng)該同時(shí)出現(xiàn);
錯(cuò)誤異常
錯(cuò)誤異常分為程序異常(系統(tǒng)異常)和業(yè)務(wù)異常;
程序異常會(huì)導(dǎo)致程序不能正常執(zhí)行;業(yè)務(wù)異常不會(huì),業(yè)務(wù)異常的處理屬于業(yè)務(wù)邏輯的一部分;
ERROR 級(jí)別的日志,一出,意味著開發(fā)運(yùn)維人員要介入了,要操作確認(rèn)一下東西,要維修一些東西了;
業(yè)務(wù)系統(tǒng)開發(fā)過程中,不需要 log.error 記錄異常,讓框架和容器(Tomcat等)來做;
業(yè)務(wù)異常的需要開發(fā)者開發(fā)對(duì)應(yīng)的異常處理邏輯,業(yè)務(wù)異常不是程序異常;比如用戶登陸失敗;
業(yè)務(wù)異常的處理屬于正常的業(yè)務(wù)邏輯,不應(yīng)該log.error,不重要的可以不log,重要的可以使用log.warn記錄,避免用戶投訴時(shí),可以追溯信息;
數(shù)據(jù)庫(kù)或者kafka在應(yīng)用啟動(dòng)時(shí)連不上是如何處理的,在應(yīng)用運(yùn)行過程中是如何處理的?啟動(dòng)時(shí),依賴的插件有問題,應(yīng)用直接啟動(dòng)不起來;如果應(yīng)用已經(jīng)啟動(dòng)起來了,觸發(fā)到跟其交互時(shí),拋出異常,程序還是正常執(zhí)行;
ExceptionHandler的默認(rèn)的處理邏輯
ExceptionHandler的默認(rèn)的處理邏輯不要吃掉所有的異常,log.error打印出來,這個(gè)邏輯主要用來處理程序異常,業(yè)務(wù)異常都應(yīng)有對(duì)應(yīng)的處理邏輯;
@ExceptionHandler(Throwable.class) @ResponseBody public String handle(Throwable e) {log.error(e.getMessage(),e);//構(gòu)造返回信息return e.getMessage(); }程序異常
各個(gè)組件的異常信息可以各自處理;比如SQLExcption,需要如果SQL 出異常,異常的信息中會(huì)有SQL相關(guān)的信息,如果直接返回給前端,會(huì)造成安全問題,前端對(duì)此異常也不關(guān)心,而后端開發(fā)者關(guān)心的信息應(yīng)該都記錄在日志中,以方便分析問題;
@ExceptionHandler(SQLException.class) @ResponseBody public String handle(SQLException e) {log.error(e.getMessage(),e);//構(gòu)造返回信息,記得脫敏return e.getMessage(); }各個(gè)組件的SDK一般都會(huì)有自己的異常體系;可以根據(jù)情況直接對(duì)頂級(jí)異常類,或者典型的異常子類進(jìn)行處理;
接入外部組件時(shí),首先分析其SDK的異常體系,編寫對(duì)應(yīng)的ExceptionHandler
org.apache.kafka.common.KafkaException
org.springframework.kafka.KafkaException
java.sql.SQLException
鏈路追蹤
多個(gè)進(jìn)程間的日志聯(lián)動(dòng)
集中式日志存儲(chǔ)系統(tǒng)的存在,讓在一個(gè)入口處理業(yè)務(wù)系統(tǒng)的日志成為了可能,產(chǎn)生了高級(jí)的用法,鏈路追蹤;
用戶的一個(gè)動(dòng)作觸發(fā)的在各個(gè)系統(tǒng)的所有的執(zhí)行邏輯,使用一個(gè)標(biāo)識(shí)將其聯(lián)系起來,開發(fā)人員分析的時(shí)候,可以根據(jù)此標(biāo)識(shí)查詢所有相關(guān)的日志,哪里出問題,一目了然;
遠(yuǎn)程調(diào)用
遠(yuǎn)程調(diào)用的plan b,就是熔斷降級(jí)里面的Plan B;
外部接口部分,客戶端請(qǐng)求參數(shù)(REST/WS),調(diào)用第三方時(shí)的調(diào)用參數(shù)和調(diào)用結(jié)果使用info
如果出異常,調(diào)用過程異常或者返回錯(cuò)誤碼,根據(jù)情況選擇拋出異常或者啟用Plan B;
拋出異常意味著程序正常流程執(zhí)行結(jié)束,需要處理這個(gè)異常,warn記錄此異常,然后返回用戶結(jié)果;
Plan B意味著程序還可以正常執(zhí)行下去,warn記錄發(fā)生了此事件,出現(xiàn)異常轉(zhuǎn)入Plan B;
遠(yuǎn)程調(diào)用過程中出異常,意味著需要開發(fā)人員介入,應(yīng)該記錄 error 級(jí)別的異常;
如果是返回的錯(cuò)誤碼是非成功執(zhí)行的錯(cuò)誤碼,這時(shí)候應(yīng)該根據(jù)錯(cuò)誤碼的級(jí)別拋出不同的異常,處理異常的地方根據(jù)遠(yuǎn)程調(diào)用的接口的重要程度評(píng)估使用不同的日志級(jí)別。
驗(yàn)證日志
提交代碼前,確定通過日志可以看到一個(gè)功能的整個(gè)執(zhí)行流程,可以通過日志進(jìn)行問題定位程序執(zhí)行的路徑;
參考
用JAVA日志來寫詩(shī)
JAVA - 優(yōu)雅的記錄日志(log4j實(shí)戰(zhàn)篇)
Alibaba Java Coding Guidelines
小白學(xué)習(xí)如何打日志
正確的打日志姿勢(shì)
Java常用日志框架介紹
總結(jié)
以上是生活随笔為你收集整理的业务系统日志记录规范总结的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python Excel xlwt 富文
- 下一篇: VB对象及其属性、事件和方法