【线上问题排查技巧】动态修改LOGGER日志级别
前言
大多数情况下,我们会在打印日志时定义日志的LOGGER级别,用来控制输出的信息范围。
一方面,过多的输出会影响查看日志的效率,另一方面,过少的日志让问题定位变得困难。
但当线上出现问题时,线上容器通常定义在info级别,发生一些疑难问题时,光靠info级别的日志很难定位问题。
一个典型的场景:在一些需要打印MySQL语句的场景,如果你正在使用MyBatis框架,由于MyBaits中SQL语句是DEBUG级别的信息,通常在线上容器就没法看到。
一个丑陋的解决办法就是在沙箱/预发环境,将log4j.xml中的info改为debug:
<Root level="info">
<AppenderRef ref="detail"/>
<AppenderRef level="error" ref="error"/>
</Root>
然后重新打包部署,再发起请求来调试代码。
甚至在一些无法模拟请求的场景下,还需要将修改灰度至线上环境,大量的debug信息会对线上服务造成实质性的影响。
本文简要介绍如何使用阿里巴巴开源Java调试工具Arthas,实时修改线上服务的LOGGER级别,从而免去打包再部署的繁杂手续,更快的定位线上问题。
效果演示:
本文内容重点:
- Arthas工具简介
- 本地测试:实时修改LOGGER级别
- 线上实战:实时打印MyBatis SQL语句
- 总结
本文阅读大概需要:2分钟
码字不易,欢迎关注我的个人原创技术公众号:后端技术漫谈(二维码见文章底部)
Arthas工具简介
Arthas是阿里开源的Java诊断工具,它的功能可以大致参考下图:
它运行的原理是通过字节码生成工具(ASM字节码增强),将代理逻辑编织到原来的类里,实现对应的监控调试等功能。
关于Arthas这个工具,之前我写了一篇完整的总结文章,包括所有功能的使用和原理初探,可以去原文章查看:https://juejin.im/post/6844903998730797070
本地测试:实时修改LOGGER级别
安装arthas
网络安装
在接通外网的环境下,可以使用快速网络安装,会从阿里的源拉去全量包。
curl -O https://arthas.aliyun.com/arthas-boot.jar
java -jar arthas-boot.jar
全量安装
如果本地外网环境不通,比如某些容器内是不允许外网访问的,那么可以使用预先下载好的全量安装包,然后解压后运行包内的jar,使用命令:
java -jar arthas-boot.jar
启动arthas
我在本地启动arthas,效果如下图:
全局Logger信息
使用命令:
logger
可以看到所有logger的信息,包括其中每个appenders。
使用如下命令,修改名称为ROOT的logger的日志级别至debug级别:
logger --name ROOT --level debug
可以看到多出了debug级别的输出。
指定类名的logger信息
在有多个logger的情况下,可以查找指定名称的logger
logger -n ROOT
指定classloader的logger信息
如果需要改变指定类的输出级别,先要定位到该类的classLoader,然后修改该clasLoader的logger。
使用sc命令查看你需要改变的类信息:
sc -d cn.monitor4all.miaoshaweb.DynamicLoggerTest | grep classLoaderHash
随后可以通过classLoader找到其对应的logger:
logger -c 18b4aac2
然后就可以调整对应的logger日志级别:
logger -c 18b4aac2 --name ROOT --level debug
使用 ongl 命令
此外,Arthas还支持使用ognl来修改日志级别。但是这种方法对log4j不友好,修改会报错。并且就算支持的logback/slf4j,也需要复杂的形如ognl -c @org.slf4j.LoggerFactory@getLogger("root").setLevel()
的命令才能修改,并不是一个很好的办法。
线上实战:实时打印MyBatis SQL语句
容器内启动arthas
我的线上容器,是没有外网访问权限的(这种情况蛮常见的),我将全量包解压在容器内运行:
打印DEBUG级别的SQL日志
下图是没有DEBUG信息的一条请求日志,可以看到只有入参出参的拦截器信息(INFO级别):
使用logger --name ROOT --level debug
,将SQL语句输出出来:
毕竟,很多时候线上的bug是不小心拼错SQL导致。
总结
文章简单总结了使用Arthas来动态调整日志级别的使用方法。在线上环境,能够有效的提升排查问题的效率。当然Arthas能做的还远不止于此,更多有趣并且实用的功能等待大家的发掘。
参考
- https://jueee.github.io/2020/08/2020-08-20-Arthas之查看和修改日志级别/
- https://arthas.aliyun.com/doc/logger.html#appenderlogger
- https://juejin.im/post/6844903959195303943
关注我
我是一名奋斗在一线的互联网后端开发工程师。
主要关注后端开发,数据安全,边缘计算等方向,欢迎交流。
各大平台都可以找到我
- 微信公众号:后端技术漫谈
- Github:@qqxx6661
- CSDN:@蛮三刀把刀
- 知乎:@后端技术漫谈
- 掘金:@蛮三刀把刀
- 腾讯云+社区:@后端技术漫谈
- 博客园:@后端技术漫谈
- BiliBili:@蛮三刀把刀
原创文章主要内容
- 后端开发实战
- Java面试
- 设计模式/数据结构/算法题解
- 读书笔记/逸闻趣事/游戏人生
个人公众号:后端技术漫谈
如果文章对你有帮助,不妨点赞,收藏起来~
最新文章
- [转]js 将图片连接转换称base64格式
- Eclipse调试方法及快捷键
- visio 交叉线 不出现拱形怎么办?
- linux 挂载命令详解
- magento 全页缓存
- Android intent-filter 简单用法
- 如何理解js
- php集成开发环境IDE
- tlb转dll
- maven项目启动
- Java排序方法sort的使用详解
- for/range/break/continue
- Android进阶 | 摆脱斗图 | 行业交流 | 深度学习 | 付费
- hdu 5289 Assignment (ST+二分)
- 763. Partition Labels 相同字母出现在同一块中,且块数最多
- 二进制加法Java实现
- Docker 本地导入镜像/保存镜像/载入镜像/删除镜像
- Linux命令之ll
- php之memcached存储session配置、存储、获取
- 数据库iops的理解
热门文章
- shell-逻辑操作符讲解与文件条件测试多范例多生产案例
- 多测师讲解自动化测试 _接口面试题(001)_高级讲师肖sir
- centos8平台用redis-cli对redis5监控和管理
- 了解Js中的client,offset
- APP UI自动化测试思路总结
- 并发编程——多线程计数的更优解:LongAdder原理分析
- 专攻知识小点——回顾JavaWeb中的servlet(二)
- E. Tree Queries 解析(思維、LCA)
- Dev中配置graphcis.h
- LoadRunner11web压力测试录制、回放、负载前的准备