手寫了個(gè)小中間件,開源啦
項(xiàng)目名稱:LogLevelSwitch(運(yùn)行時(shí)動(dòng)態(tài)日志等級(jí)開關(guān))。
項(xiàng)目地址,走過路過可以點(diǎn)個(gè)star :)
https://github.com/saigu/LogLevelSwitch。
1、為什么需要LogLevelSwitch
隨著業(yè)務(wù)規(guī)模不斷擴(kuò)大,每一次線上故障的快速定位都是對(duì)開發(fā)同學(xué)的巨大挑戰(zhàn)。
通過日志進(jìn)行業(yè)務(wù)關(guān)鍵邏輯的輸出,是定位問題的有效手段之一。但是,過多的日志記錄又會(huì)對(duì)系統(tǒng)造成額外的開銷,極端情況下,甚至可能導(dǎo)致系統(tǒng)宕機(jī)。
因此,為了兼顧性能和故障場(chǎng)景下的快速定位,我們需要能夠?qū)崟r(shí)調(diào)整日志等級(jí),以便輸出更多的日志信息排查線上問題,或是減少日志打印帶來的性能消耗。
基于以上背景,我們的LogLevelSwitch誕生了。
LogLevleSwitch以中間件的形式嵌入應(yīng)用,基于配置中心的熱更新能力,實(shí)現(xiàn)了應(yīng)用運(yùn)行時(shí)動(dòng)態(tài)調(diào)整日志等級(jí)的能力。
2、功能特性
兼容性:支持Log4j、Log4j2、Logback等。
擴(kuò)展性:可以使用默認(rèn)的基于本地配置文件的配置修改方式(僅供本地測(cè)試學(xué)習(xí)使用)。生產(chǎn)上,「強(qiáng)烈推薦」 通過SPI接入你自己的配置中心,實(shí)現(xiàn)熱更新。
易用性:接入簡(jiǎn)單,效果拔群,只要5分鐘你就能用上。
3、基本架構(gòu)
在應(yīng)用Application中引入我們的LogLevelSwitch。
LogLevelSwitch包含兩個(gè)核心組件,LogContext和SwitchContext。
- SwitchContext: 保存從配置中心獲取的switch開關(guān)狀態(tài)與具體Logger配置信息。通過監(jiān)聽配置中心消息,實(shí)時(shí)更新switch內(nèi)容,并實(shí)現(xiàn)對(duì)Logger等級(jí)的修改通知。
- LogContext:保存應(yīng)用原始的Logger與日志級(jí)別信息,并能夠根據(jù)switch配置 更新 或 復(fù)原 Logger的等級(jí)。
4、Quick Start
話不多說了,快來嘗嘗鮮吧。
(1) 普通spring項(xiàng)目
只用三步即可完成。
STEP 1: 應(yīng)用中pom引入依賴。
<dependency>
<groupId>io.github.saigu</groupId>
<artifactId>log-switch-core</artifactId>
<version>1.0.0-beta</version>
</dependency>
STEP 2: 構(gòu)建config Bean。
@Configuration
public class LogLevelSwitchConfig {
@Bean
LogLevelSwitch logLevelSwitch() {
return new LogLevelSwitch();
}
}
STEP 3: 接入配置中心。
聲明配置中心的SPI實(shí)現(xiàn)。
- 在resource路徑下新建 META-INF/services,創(chuàng)建文件名為
- io.github.saigu.log.level.sw.listener.ConfigListener的文件,并寫入需要的「實(shí)現(xiàn)類名」。
實(shí)現(xiàn)一:項(xiàng)目自帶的LocalFile配置中心。
如果你還沒有自己的配置中心,那就使用我們自帶的基于本地配置文件進(jìn)行本地測(cè)試學(xué)習(xí)。
「實(shí)現(xiàn)類名」為:
io.github.saigu.log.level.sw.listener.LocalFileListener
注意,生產(chǎn)上 強(qiáng)烈推薦 通過「實(shí)現(xiàn)二」接入你自己的配置中心,實(shí)現(xiàn)熱更新。
在resource目錄下新建LocalSwitch.json文件:
然后填寫開關(guān)配置:
{
"status": "on",
"loggerBeans": [
{
"name": "all",
"level": "error"
}
]
}
實(shí)現(xiàn)二:自定義SPI擴(kuò)展配置,接入自己的配置中心。
如果你已經(jīng)有了自己的配置中心,那就可以通過SPI擴(kuò)展配置,接入自己的配置中心。
「實(shí)現(xiàn)類名」為你自己的實(shí)現(xiàn)類名。
(2) Springboot項(xiàng)目
兩步接入。
STEP 1: 應(yīng)用中pom引入依賴。
<dependency>
<groupId>io.github.saigu</groupId>
<artifactId>log-switch-starter</artifactId>
<version>1.0.0-beta</version>
</dependency>
STEP 2: 接入配置中心。
同「方式一」。
5、關(guān)鍵配置
SwitchContext是我們的關(guān)鍵配置:
參考范例:
{
"status": "on",
"loggerBeans": [
{
"name": "all",
"level": "error"
}
]
}
6、注意事項(xiàng)
為了規(guī)范日志使用,同時(shí)避免影響降級(jí)開關(guān)效果,初始化的時(shí)候會(huì)去檢測(cè)項(xiàng)目中依賴的日志框架實(shí)現(xiàn)。
請(qǐng)注意,如果日志提示
“存在多個(gè)日志框架實(shí)現(xiàn),建議只保留一個(gè),否則會(huì)影響日志降級(jí)開關(guān)效果”
說明檢測(cè)到了應(yīng)用中引入了多個(gè)日志框架實(shí)現(xiàn)。
建議從pom中進(jìn)行移除多余日志框架,確保采用唯一日志框架實(shí)現(xiàn)。