项目地址,走过路过可以点个star :)
https://github.com/saigu/LogLevelSwitch
随着业务规模不断扩大,每一次线上故障的快速定位都是对开发同学的巨大挑战。
通过日志进行业务关键逻辑的输出,是定位问题的有效手段之一。但是,过多的日志记录又会对系统造成额外的开销,极端情况下,甚至可能导致系统宕机。
因此,为了兼顾性能和故障场景下的快速定位,我们需要能够实时调整日志等级,以便输出更多的日志信息排查线上问题,或是减少日志打印带来的性能消耗。
基于以上背景,我们的LogLevelSwitch诞生了。
LogLevleSwitch以中间件的形式嵌入应用,基于配置中心的热更新能力,实现了应用运行时动态调整日志等级的能力。
在应用Application中引入我们的LogLevelSwitch。
LogLevelSwitch包含两个核心组件,LogContext和SwitchContext。
话不多说了,快来尝尝鲜吧。
只用三步即可完成。
<dependency><groupId>io.github.saigu</groupId><artifactId>log-switch-core</artifactId><version>1.0.0-beta</version></dependency>
@ConfigurationpublicclassLogLevelSwitchConfig {@BeanLogLevelSwitchlogLevelSwitch() {returnnew LogLevelSwitch(); } }
声明配置中心的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扩展配置,接入自己的配置中心。
「实现类名」为你自己的实现类名。
两步接入。
<dependency><groupId>io.github.saigu</groupId><artifactId>log-switch-starter</artifactId><version>1.0.0-beta</version></dependency>
SwitchContext是我们的关键配置:
参数名 | 含义 | 可选值 |
status | 开关状态 | 「off」: 关闭,使用应用 「on」:开启,使用配置中心的配置等级。 |
List<LoggerBean> | 日志等级list | 如果列表的第一个LoggerBean的name为all,则影响全局logger等级 |
参考范例:
{"status":"on","loggerBeans": [ {"name":"all","level":"error" } ] }
为了规范日志使用,同时避免影响降级开关效果,初始化的时候会去检测项目中依赖的日志框架实现。
请注意,如果日志提示
“存在多个日志框架实现,建议只保留一个,否则会影响日志降级开关效果”
说明检测到了应用中引入了多个日志框架实现。
建议从pom中进行移除多余日志框架,确保采用唯一日志框架实现。
本文还是专注于介绍吧,后面再讲讲实现吧,敬请期待。
都看到最后了,原创不易,点个关注,点个赞吧~
文章持续更新,可以微信搜索「阿丸笔记 」第一时间阅读,回复【笔记】获取Canal、MySQL、HBase、JAVA实战笔记,回复【资料】获取一线大厂面试资料。
知识碎片重新梳理,构建Java知识图谱:github.com/saigu/JavaK…(历史文章查阅非常方便)