Spring Boot 使用Apollo動態調整日誌級別

楼兰胡杨發表於2024-07-28

摘要:在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日誌功能。

相關文章