当前位置: 首页 > 科技观察

在线排查技巧——动态修改Logger级别

时间:2023-03-14 23:06:11 科技观察

前言大多数情况下,我们在打印日志时都会定义日志的LOGGER级别,以控制输出信息的范围。一方面,过多的输出会影响查看日志的效率;另一方面,日志太少导致问题难以定位。但是当在线出现问题时,在线容器通常定义在信息级别。当出现一些疑难问题时,仅靠info级别的日志是很难定位问题的。一个典型的场景:在一些需要打印MySQL语句的场景下,如果你使用的是MyBatis框架,由于MyBaits中的SQL语句是DEBUG级别的信息,通常在线容器是看不到的。一个丑陋的解决方案是更改log4j.xml中的信息以在沙箱/预发布环境中进行调试:然后重新打包部署,然后发起请求调试代码。甚至在一些无法模拟请求的场景下,还需要对线上环境进行灰度化修改,大量的debug信息会对线上业务产生实质性的影响。"本文简单介绍如何使用阿里巴巴开源的Java调试工具Arthas实时修改在线服务的LOGGER级别,从而免去繁琐的打包部署过程,更快定位在线问题。"》效果演示:》本文重点内容:》Arthas工具介绍本地测试:实时修改LOGGER层在线实战:实时打印MyBatisSQL语句字节码生成工具(ASM字节码增强)将代理逻辑编织到原始类中,实现相应的监控和调试功能。关于Arthas这个工具,之前《我写了一篇完整的总结文章》,包括所有功能的使用和原理,大家可以去原文章查看:https://juejin.im/post/6844903998730797070本地测试:real-LOGGER级别安装时间修改arthas网络安装是连接外网环境,可以使用极速网络安装,会从阿里源拉取完整包。curl-Ohttps://arthas.aliyun.com/arthas-boot.jarjava-jararthas-boot.jar完整安装如果本地外网环境不可达,比如有些容器不允许外网访问,那么可以使用预先下载好完整安装包,然后解压运行包中的jar,使用命令:java-jararthas-boot.jar启动arthas我是在本地启动arthas,效果如下:GlobalLoggerinformationUsethe命令:记录器查看所有记录器信息,包括每个附加程序。使用如下命令将名为ROOT的logger的日志级别修改为debug级别:logger--nameROOT--leveldebug,可以看到debug级别的输出比较多。指定类名的Logger信息如果有多个Logger,可以搜索指定类名的指定ClassLoader的Logger信息。记录器。sc-dcn.monitor4all.miaoshaweb.DynamicLoggerTest|grepclassLoaderHash使用sc命令查看需要更改的类信息:然后可以通过classLoader找到对应的logger:logger-c18b4aac2然后调整对应的logger日志级别:logger-c18b4aac2--nameROOT--leveldebug使用ongl命令此外,Arthas还支持使用ognl修改日志级别。但是这种方式对log4j不友好,修改会报错。而且即使支持logback/slf4j,也需要复杂的命令比如ognl-c@org.slf4j.LoggerFactory@getLogger("root").setLevel()来修改,这不是一个好办法。在线实战:实时打印MyBatisSQL语句在容器中启动arthas我的在线容器无法访问外网(这种情况比较常见),我解压全包在容器中运行:打印DEBUG级别的SQL下图是没有DEBUG信息的请求日志。只能看到输入输出参数的拦截器信息(INFO级别):使用logger--nameROOT--leveldebug输出SQL语句:毕竟很多时候网上的bug都是不小心把SQL拼错了导致的。总结文章简单总结了如何使用Arthas动态调整日志级别。在线环境可以有效提高故障排除效率。当然,Arthas能做的远不止于此,更多有趣、“实用”的功能等待大家去发现。参考https://jueee.github.io/2020/08/2020-08-20-Arthas%E4%B9%8B%E6%9F%A5%E7%9C%8B%E5%92%8C%E4%BF%AE%E6%94%B9%E6%97%A5%E5%BF%97%E7%BA%A7%E5%88%AB/https://arthas.aliyun.com/doc/logger.html#appenderloggerhttps://juejin.im/post/6844903959195303943本文转载自微信公众号“后端技术漫谈”,可通过以下二维码关注。转载本文请联系后台技术讲座公众号。