写点什么

线上排障技巧 | 动态修改 LOGGER 级别

用户头像
AI乔治
关注
发布于: 2020 年 11 月 13 日
线上排障技巧 | 动态修改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 级别,从而免去打包再部署的繁杂手续,更快的定位线上问题。」

「效果演示:」



本地测试:实时修改 LOGGER 级别

安装 arthas

网络安装

在接通外网的环境下,可以使用快速网络安装,会从阿里的源拉去全量包。

curl -O https://arthas.aliyun.com/arthas-boot.jarjava -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 能做的还远不止于此,更多有趣并且「实用」的功能等待大家的发掘。


看完三件事❤️

如果你觉得这篇内容对你还蛮有帮助,我想邀请你帮我三个小忙:



  1. 点赞,转发,有你们的 『点赞和评论』,才是我创造的动力。

  2. 关注公众号 『 java 烂猪皮 』,不定期分享原创知识。

  3. 同时可以期待后续文章 ing🚀


作者:后端技术漫谈

出处:https://club.perfma.com/article/1989496

用户头像

AI乔治

关注

分享后端技术干货。公众号【 Java烂猪皮】 2019.06.30 加入

一名默默无闻的扫地僧!

评论

发布
暂无评论
线上排障技巧 | 动态修改LOGGER级别