寫了個開源小中間件——運行時動態日志等級開關


項目地址,走過路過可以點個star :)

https://github.com/saigu/LogLevelSwitch

1.為什么需要LogLevelSwitch

隨着業務規模不斷擴大,每一次線上故障的快速定位都是對開發同學的巨大挑戰。

通過日志進行業務關鍵邏輯的輸出,是定位問題的有效手段之一。但是,過多的日志記錄又會對系統造成額外的開銷,極端情況下,甚至可能導致系統宕機。

因此,為了兼顧性能和故障場景下的快速定位,我們需要能夠實時調整日志等級,以便輸出更多的日志信息排查線上問題,或是減少日志打印帶來的性能消耗。

寫了個開源小中間件——運行時動態日志等級開關

 

基於以上背景,我們的LogLevelSwitch誕生了。

LogLevleSwitch以中間件的形式嵌入應用,基於配置中心的熱更新能力,實現了應用運行時動態調整日志等級的能力。

2.功能特性

  • 兼容性:支持Log4j、Log4j2、Logback等。
  • 擴展性:可以使用默認的基於本地配置文件的配置修改方式(僅供本地測試學習使用)。生產上,「強烈推薦」 通過SPI接入你自己的配置中心,實現熱更新。
  • 易用性:接入簡單,效果拔群,只要5分鍾你就能用上。

3.基本架構

寫了個開源小中間件——運行時動態日志等級開關

 

在應用Application中引入我們的LogLevelSwitch。

LogLevelSwitch包含兩個核心組件,LogContext和SwitchContext。

  • SwitchContext: 保存從配置中心獲取的switch開關狀態與具體Logger配置信息。通過監聽配置中心消息,實時更新switch內容,並實現對Logger等級的修改通知。
  • LogContext:保存應用原始的Logger與日志級別信息,並能夠根據switch配置 更新 或 復原 Logger的等級。

4.Quick Start

話不多說了,快來嘗嘗鮮吧。

4.1 普通spring項目

只用三步即可完成。

  • STEP 1: 應用中pom引入依賴
<dependency> <groupId>io.github.saigu</groupId> <artifactId>log-switch-core</artifactId> <version>1.0.0-beta</version> </dependency>
  • STEP 2: 構建config Bean
@Configuration public class LogLevelSwitchConfig { @Bean LogLevelSwitch logLevelSwitch() { return new LogLevelSwitch(); } }
  • STEP 3: 接入配置中心

聲明配置中心的SPI實現。

在resource路徑下新建 META-INF/services,創建文件名為
io.github.saigu.log.level.sw.listener.ConfigListener的文件,並寫入需要的「實現類名」。

實現一:項目自帶的LocalFile配置中心

如果你還沒有自己的配置中心,那就使用我們自帶的基於本地配置文件進行本地測試學習。

「實現類名」為
io.github.saigu.log.level.sw.listener.LocalFileListener

注意,生產上 強烈推薦 通過「實現二」接入你自己的配置中心,實現熱更新。

在resource目錄下新建LocalSwitch.json文件:

寫了個開源小中間件——運行時動態日志等級開關

 

然后填寫開關配置:

{
  "status": "on", "loggerBeans": [ { "name": "all", "level": "error" } ] } 

實現二:自定義SPI擴展配置,接入自己的配置中心

如果你已經有了自己的配置中心,那就可以通過SPI擴展配置,接入自己的配置中心。

「實現類名」為你自己的實現類名。

 

4.2 springboot項目

兩步接入。

  • STEP 1: 應用中pom引入依賴
<dependency> <groupId>io.github.saigu</groupId> <artifactId>log-switch-starter</artifactId> <version>1.0.0-beta</version> </dependency>
  • STEP 2: 接入配置中心
    同「方式一」

5.關鍵配置

SwitchContext是我們的關鍵配置:

參數名

含義

可選值

status

開關狀態

「off」: 關閉,使用應用 「on」:開啟,使用配置中心的配置等級。

List<LoggerBean>

日志等級list

如果列表的第一個LoggerBean的name為all,則影響全局logger等級

參考范例:

{
  "status": "on", "loggerBeans": [ { "name": "all", "level": "error" } ] } 

6.注意事項

為了規范日志使用,同時避免影響降級開關效果,初始化的時候會去檢測項目中依賴的日志框架實現。

請注意,如果日志提示

“存在多個日志框架實現,建議只保留一個,否則會影響日志降級開關效果”

說明檢測到了應用中引入了多個日志框架實現。

建議從pom中進行移除多余日志框架,確保采用唯一日志框架實現。

7.詳細設計 TL;DR

本文還是專注於介紹吧,后面再講講實現吧,敬請期待。

 

都看到最后了,原創不易,點個關注,點個贊吧~
文章持續更新,可以微信搜索「阿丸筆記 」第一時間閱讀,回復【筆記】獲取Canal、MySQL、HBase、JAVA實戰筆記,回復【資料】獲取一線大廠面試資料。
知識碎片重新梳理,構建Java知識圖譜: github.com/saigu/JavaK…(歷史文章查閱非常方便)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM