Spring Boot 使用Apollo動態調整日志級別
摘要:在Spring Boot 項目中,借助Apollo動態修改配置的能力,結合Logback修改日志級別打印執行的SQL腳本。
綜述
??在生產環境偶現測試環境未發現的SQL查詢BUG,但由于線上關閉debug和trace級別日志導致缺少執行SQL、異常堆棧等日志信息,沒有辦法火速定位問題根源。面對這樣的線上問題,通常的解決方案如下:
方案一:修改服務代碼,將日志級別改成DEBUG并發版,排查完問題之后,將日志級別改回原日志級別,再上一次線,整個生命周期很長,而且需要修改代碼。
方案二:在上線的時候設置日志級別為INFO,但是,不會打印執行的SQL語句,不滿足訴求。
??上述方案一不夠優雅,而且發版是有嚴格流程的,不能隨意發版。方案二滿足不了需要打印SQL腳本的訴求。如果有一種方式,能夠動態修改日志級別,在需要排查問題的時候改成DEBUG,不需要的時候就恢復INFO,豈不妙哉?有,請移步《Spring Boot + Apollo 動態修改日志級別》,本文討論的核心是基于方案一的偽動態配置日志打印級別,但是,不需要改服務代碼,只修改配置中心和重啟服務。樓蘭胡楊在《性能調優之日志打印的坑》中討論了如何避免打印日志時常見的不優雅操作,感興趣的猿友可以去了解一下。
解決方案
??在 Spring Boot 中,日志的打印基于監聽器機制實現。Spring Boot集成了配置中心Apollo和日志框架logback,所以,可以在Apollo設置輸出到控制臺的日志級別,然后重啟服務即可生效,當然,如果是在線上環境配置的,請使用之后及時回滾配置。在Apollo中使用如下格式設置打印級別:
logging.level.file.path = logLevel
??logging.level:用于設置日志級別,file.path為日志級別logLevel生效的作用域,可以是需要打印日志的包名,也可以是具體的類名。
??logLevel:選項包括trace、debug、info、warn、error和fatal。debug級別日志用于記錄一些關鍵操作的詳細信息,通常在開發和測試階段使用,本文用于線上環境調試應用程序,提供詳細的執行信息,有助于發現問題。
??在application.properties(.yml)或者Apollo中增加如下配置后,可以去控制臺觀察打印效果:
logging.level.com.huyang=error // com.huyang包下所有class以error級別輸出日志
logging.level.com.huyang.querydao.WienerDao=debug //com.huyang.querydao包下的類WienerDao以debug級別輸出執行的SQL語句
??如果在application.properties中已經設置了,優先使用Apollo配置的日志級別。
關于logging.lever.root=info,其中 root 指把整個項目日志級別調整為error, 即可實現關閉絕大部分項目啟動日志運行日志(近似關閉,亦可使用 off)。
logging.lever.com.xxx.querydao 其中com.xxx.querydao可為mapper文件對應的包,即可實現打印sql日志功能。
Buy me a coffee. ?Get red packets.
浙公網安備 33010602011771號