无需代码部署即可启停控制器日志中间件的实现方案
控制器级动态启停日志中间件的实现思路
1. 配置中心动态配置方案
- 依托配置中心(如Nacos、Apollo或自研键值存储)存储控制器开关规则,格式示例:
controller-log-switches: {"com.example.controller.UserController": true, "com.example.controller.OrderController": false},键用控制器全类名,值为启停状态。 - 中间件执行日志逻辑前,先从配置中心拉取最新配置:
- 通过请求上下文获取当前处理的控制器类名;
- 匹配到对应开关状态为
false时,直接跳过日志流程,进入下一个中间件。
- 配置中心支持实时推送变更,修改配置后无需重启服务,中间件会即时读取最新状态。
2. 动态注解注入方案
- 定义一个
@LogSwitch注解,包含enable属性(默认false),无需提前写在控制器代码里。 - 借助Spring的
BeanPostProcessor或ASM字节码技术,实现运行时给指定控制器动态添加/移除该注解:- 中间件通过反射检查当前控制器是否带有
@LogSwitch(enable=true)标记,有则执行日志逻辑,否则跳过。
- 中间件通过反射检查当前控制器是否带有
- 开发一个后台接口(如
/admin/log-switch/update),接收控制器标识和开关状态,触发动态注解的增删操作,操作后立即生效。
3. 数据库规则存储+缓存方案
- 创建一张
controller_log_switch表,字段包括controller_name(控制器全类名)、enable(布尔型)、update_time。 - 中间件处理请求前,先查询该表的开关状态:
- 为避免频繁查库,引入本地缓存(如Guava Cache),设置10秒左右的过期时间,平衡性能与实时性;
- 提供后台管理页面或接口修改表中数据,缓存过期后自动读取最新配置。
4. 请求级临时触发方案(适配临时排查)
- 支持通过自定义请求头(如
X-Enable-Log: true)或请求参数临时开启日志:- 中间件优先检查这类临时标识,若存在且为
true,则强制执行日志逻辑,忽略全局开关配置; - 适合开发/测试人员临时排查问题,无需修改全局配置,用完即停。
- 中间件优先检查这类临时标识,若存在且为
内容的提问来源于stack exchange,提问作者user2327358
相关产品推荐
相关产品推荐

