社区编辑申请
注册/登录
手写了个小中间件,开源啦
开源
通过日志进行业务关键逻辑的输出,是定位问题的有效手段之一。但是,过多的日志记录又会对系统造成额外的开销,极端情况下,甚至可能导致系统宕机。

项目名称:LogLevelSwitch(运行时动态日志等级开关)。

项目地址,走过路过可以点个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

话不多说了,快来尝尝鲜吧。

(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扩展配置,接入自己的配置中心。

「实现类名」为你自己的实现类名。

(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": "on",
"loggerBeans": [
{
"name": "all",
"level": "error"
}
]
}

6、注意事项

为了规范日志使用,同时避免影响降级开关效果,初始化的时候会去检测项目中依赖的日志框架实现。

请注意,如果日志提示

“存在多个日志框架实现,建议只保留一个,否则会影响日志降级开关效果”

说明检测到了应用中引入了多个日志框架实现。

建议从pom中进行移除多余日志框架,确保采用唯一日志框架实现。

责任编辑:姜华 来源: 阿丸笔记
相关推荐

2022-05-11 15:08:52

驱动开发系统移植

2022-06-24 11:14:00

美团开源

2022-07-04 23:16:21

开源技术容器

2022-06-06 15:18:41

开源GiteaDrone

2022-06-10 07:45:09

CentOS国产操作系统

2022-06-28 10:03:56

CentOSLinux

2022-06-14 15:07:04

IPC客户端服务端

2022-05-09 09:52:28

K8sLens开源

2022-07-04 09:00:36

Playwright自动化测试工具

2022-06-20 09:45:48

Python开源可视化库

2022-06-07 10:40:05

蓝牙鸿蒙

2022-06-22 09:19:55

HDC鸿蒙ADB命令

2022-06-16 11:06:07

开源Grafanaon-call

2022-06-03 09:41:03

DockerKubernetes容器

2022-06-24 07:08:24

OHOS自定义服务

2022-06-27 12:44:34

RustLinux

2022-06-25 21:22:30

编程Rust代码

2022-06-17 18:32:54

开源大数据数据调度

2022-05-31 10:57:56

腾讯开源人才

2022-06-01 17:47:24

运维监控系统

同话题下的热门内容

Copilot收费,惹怒软件自由保护协会SFC:停止使用GitHub,时机已到DevOps 工具链管理器 DevStream 还真是神器!阿里&蚂蚁联合开源的 IDE 研发框架 - OpenSumi2022 年开源技术六大趋势2022 年开源技术六大趋势四个用于在云原生环境中运行虚拟机的开源工具软件自由保护协会拒绝Github!代码“借用”界限何在?Kuro:非官方的微软 To-Do Linux 桌面客户端

编辑推荐

十大免费开源云文件共享平台使用Go语言开发必备的5大开源工具开源人脸识别seetaface入门教程(一)Docker不香吗,为啥还要K8s?值得考虑的九大开源ERP系统,看看都有谁
我收藏的内容
点赞
收藏

51CTO技术栈公众号