手写了个小中间件,开源啦

本文涉及的产品
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
简介: 手写了个小中间件,开源啦

1.为什么需要LogLeveISeitch


随着业务规模不断扩大,每一次线上故障的快速定位都是对开发同学的巨大挑战。


通过日志进行业务关键逻辑的输出,是定位问题的有效手段之一。但是,过多的日志记录又会对系统造成额外的开销,极端情况下,甚至可能导致系统宕机。


因此,为了兼顾性能和故障场景下的快速定位,我们需要能够实时调整日志等级,以便输出更多的日志信息排查线上问题,或是减少日志打印带来的性能消耗。

154.jpg


基于以上背景,我们的LogLevelSwitch诞生了。


LogLevleSwitch以中间件的形式嵌入应用,基于配置中心的热更新能力,实现了应用运行时动态调整日志等级的能力。


2.功能特性


  • 兼容性:支持Log4j、Log4j2、Logback等。
  • 扩展性:可以使用默认的基于本地配置文件的配置修改方式(仅供本地测试学习使用)。生产上,「强烈推荐」 通过SPI接入你自己的配置中心,实现热更新。
  • 易用性:接入简单,效果拔群,只要5分钟你就能用上。


3.基本架构


155.png


在应用Application中引入我们的LogLevelSwitch。


LogLevelSwitch包含两个核心组件,LogContext和SwitchContext。


  • SwitchContext:  保存从配置中心获取的switch开关状态与具体Logger配置信息。通过监听配置中心消息,实时更新switch内容,并实现对Logger等级的修改通知。
  • LogContext:保存应用原始的Logger与日志级别信息,并能够根据switch配置 更新 或 复原 Logger的等级。


4.Quick Strat


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


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文件:

156.png


然后填写开关配置:


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


实现二:自定义SPI扩展配置,接入自己的配置中心

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

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


4.2Springboot项目


两步接入。


  • 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


本文还是专注于介绍吧,后面再讲讲实现吧,敬请期待。

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
6月前
|
缓存 监控 NoSQL
一个.Net Core开源缓存中间件,让你更加简单、方便使用缓存
一个.Net Core开源缓存中间件,让你更加简单、方便使用缓存
142 0
|
8月前
|
运维 监控 安全
开源中间件的难度
开源中间件的难度
107 0
|
9月前
|
消息中间件 中间件 Kafka
限时开源!阿里内部消息中间件合集:MQ+Kafka+体系图+笔记
近好多小伙伴说在准备金三银四的面试突击了,但是遇到消息中间件不知道该怎么学了,问我有没有成体系的消息中间件的学习方式。 额,有点不知所措,于是乎小编就想着做一次消息中间件的专题,归类整理了一些纯手绘知识体系图、面试以及相关的学习笔记。
201 1
|
12月前
|
消息中间件 SQL 监控
星标1.4k,一款国产开源数据同步中间件,支持多种数据源和预警功能!
星标1.4k,一款国产开源数据同步中间件,支持多种数据源和预警功能!
|
12月前
|
消息中间件 存储 机器学习/深度学习
带你读《企业级云原生白皮书项目实战》——4.4.3 开源日志方案比对
带你读《企业级云原生白皮书项目实战》——4.4.3 开源日志方案比对
159 0
|
Arthas 运维 容灾
阿里云中间件开源往事(2)
阿里云中间件开源往事
254 1
|
消息中间件 Dubbo Java
阿里云中间件开源往事(1)
阿里云中间件开源往事
123 1
|
canal 消息中间件 JSON
实战!Spring Boot 整合 阿里开源中间件 Canal 实现数据增量同步!
实战!Spring Boot 整合 阿里开源中间件 Canal 实现数据增量同步!
|
存储 Kubernetes 网络协议
【分布式技术专题】「OSS中间件系列」从0到1的介绍一下开源对象存储MinIO技术架构
【分布式技术专题】「OSS中间件系列」从0到1的介绍一下开源对象存储MinIO技术架构
560 0
【分布式技术专题】「OSS中间件系列」从0到1的介绍一下开源对象存储MinIO技术架构
|
存储 cobar NoSQL
开源数据库中间件-MyCat初探与分片实践
一个新颖的数据库中间件产品支持mysql集群,或者mariadb cluster,提供高可用性数据分片集群。
开源数据库中间件-MyCat初探与分片实践