寫了個開源小中介軟體——執行時動態日誌等級開關
專案地址,走過路過可以點個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…(歷史文章查閱非常方便)