Spring Boot 使用Apollo动态调整日志级别
摘要:在Spring Boot 项目中,借助Apollo
动态修改配置的能力,结合Logback修改日志级别打印执行的SQL脚本。
综述
在生产环境偶现测试环境未发现的SQL查询BUG,但由于线上关闭debug和trace级别日志导致缺少执行SQL、异常堆栈等日志信息,没有办法火速定位问题根源。面对这样的线上问题,通常的解决方案如下:
方案一:修改服务代码,将日志级别改成DEBUG
并发版,排查完问题之后,将日志级别改回原日志级别,再上一次线,整个生命周期很长,而且需要修改代码。
方案二:在上线的时候设置日志级别为INFO,但是,不会打印执行的SQL语句,不满足诉求。
上述方案一不够优雅,而且发版是有严格流程的,不能随意发版。方案二满足不了需要打印SQL脚本的诉求。如果有一种方式,能够动态修改日志级别,在需要排查问题的时候改成DEBUG
,不需要的时候就恢复INFO
,岂不妙哉?有,请移步《Spring Boot + Apollo 动态修改日志级别》,本文讨论的核心是基于方案一的伪动态配置日志打印级别,但是,不需要改服务代码,只修改配置中心和重启服务。楼兰胡杨在《性能调优之日志打印的坑》中讨论了如何避免打印日志时常见的不优雅操作,感兴趣的猿友可以去了解一下。
解决方案
在 Spring Boot 中,日志的打印基于监听器机制实现。Spring Boot集成了配置中心Apollo和日志框架logback,所以,可以在Apollo设置输出到控制台的日志级别,然后重启服务即可生效,当然,如果是在线上环境配置的,请使用之后及时回滚配置。在Apollo中使用如下格式设置打印级别:
logging.level.file.path = logLevel
logging.level:用于设置日志级别,file.path为日志级别logLevel生效的作用域,可以是需要打印日志的包名,也可以是具体的类名。
logLevel:选项包括trace、debug、info、warn、error和fatal。debug级别日志用于记录一些关键操作的详细信息,通常在开发和测试阶段使用,本文用于线上环境调试应用程序,提供详细的执行信息,有助于发现问题。
在application.properties(.yml)或者Apollo中增加如下配置后,可以去控制台观察打印效果:
logging.level.com.huyang=error // com.huyang包下所有class以error级别输出日志
logging.level.com.huyang.querydao.WienerDao=debug //com.huyang.querydao包下的类WienerDao以debug级别输出执行的SQL语句
如果在application.properties中已经设置了,优先使用Apollo配置的日志级别。
关于logging.lever.root=info,其中 root 指把整个项目日志级别调整为error, 即可实现关闭绝大部分项目启动日志运行日志(近似关闭,亦可使用 off)。
logging.lever.com.xxx.querydao 其中com.xxx.querydao可为mapper文件对应的包,即可实现打印sql日志功能。