logback日志级别动态切换的终极方案(Java ASM使用)
背景
一切皆有因果,所有事情,都有事件驱动。本方案的日志级别切换是由这样的背景下产生的:
- 单个生产环境上,有几百近千个微服务
- 日志级别切换不重启服务,要求即时生效果
- 由业务开发人员去修改代码或增加相关依赖配置等涉及面广,推动进度慢
- 后期动态实时过滤垃圾日志,减少io和磁盘空间成本
logback简介
在跟敌人发起战争之前,只有先发解敌方的情况,才能做到百战百胜。要想对logback的日志级别做动态切换,首先至少对logback做个初步的了解、和看看它有没有提供现成的实现方案。下面简单介绍一下logback跟这次需求有关的内容。
logback是java的日志开源组件,是log4j创始人写的,目前主要分为3个模块
- logback-core:核心代码模块
- logback-classic:log4j的一个改良版本,同时实现了
slf4j
的接口 - logback-access:访问模块与Servlet容器集成提供通过Http来访问日志的功能
- ContextInitializer类是logback自动配置流程的逻辑实现
- 日志级别由Logger维护和使用。其成员变量Level正是由Logger维护
- Logger中有filterAndLog_0_Or3Plus、filterAndLog_1、filterAndLog_2三个不同参数的过滤日志输出方法
- Logger中的setLevel就是对日志级别的维护