线上排障技巧 | 动态修改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语句
  • 总结

Arthas工具简介

Arthas是阿里开源的Java诊断工具,它的功能可以大致参考下图:

它运行的原理是通过字节码生成工具(ASM字节码增强),将代理逻辑编织到原来的类里,实现对应的监控调试等功能。

本地测试:实时修改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能做的还远不止于此,更多有趣并且「实用」的功能等待大家的发掘。

参考

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#appenderlogger
https://juejin.im/post/6844903959195303943

(0)

相关推荐

  • 第32天:Python logging 模块详解

    This module defines functions and classes which implement a flexible event logging system for applic ...

  • 求你了,别再随便打日志了,教你动态修改日志级别!

    GitHub 19k Star 的Java工程师成神之路,不来了解一下吗! GitHub 19k Star 的Java工程师成神之路,真的不来了解一下吗! GitHub 19k Star 的Java工 ...

  • 求求你,别再随便打日志了,教你动态修改日志级别!

    作者 l Hollis 来源 l Hollis(ID:hollischuang) 之前写过一篇文章<服务被干爆了!竟然是日志的锅>,介绍过一次大促故障,是因为日志量激增,导致服务器差点挂掉 ...

  • K线实战运用技巧

    k线形态千变万化,不同位置的K线形态含义也大不相同,因此,投资者在运用时一定要具体情况具体分析. 一.分析投资心理是研判的根本. 阴阳线形态形态各异,投资者很难全部掌握,而根据我们的投资经验,投资者也 ...

  • 九大拉升途中的K线组合实战技巧,轻松掌握,快乐挣钱

    今天小编要给大家讲解的炒股技巧是,买入技巧.很多人都说,有的时候选到好的股票,却总是赚不到钱,今天小编就重点来给大家讲讲,希望你们可以重点关注下,希望你们都可以用心学习下! 一.拉升途中加速三连阳 1 ...

  • 如何看KDJ线 一文读懂三条线的使用技巧(图文)

    如何看KDJ线 一文读懂三条线的使用技巧(图文) 时间:2019-05-26 20:01:32作者:admin KDJ线是重要的看盘指标之一,经过不断的实战检验,这一指标已经运用的十分成熟了.但是对于 ...

  • 【骨科小技巧】下肢力线冠状面对线的测量技巧!

    冠状面对线 ▶▶下肢力线 也称作下肢机械轴线. 站立前后位股骨头中心与踝关节中心的连线. 通过膝关节中心. 膝内翻时,位于膝关节中心内侧:外翻时,位于膝关节中心外侧. ▶▶中心点确立方法 1.由于股骨 ...

  • 布林线八大口诀,布林线的运用技巧图解

    开口,表示的是行情正在迅速的明朗,虽然投资者讨厌出现震荡行情,但是行情变化的很快,有趋势的行情并不是那么容易进场的,等到非常明确趋势走势,就已经完了,不符合盈亏比,止损过大,很难判断是否追空或者追多, ...

  • 收了!老电工不外传的线管敷设技巧

    老电工不外传的线管敷设技巧 为什么进行线管的敷设 室内线管的敷设又称为内线工程,是家装电工中重要的环节,其特点是操作方法多样.应用范围广阔等. 导线进行敷设的要求是到导线在管内受到保护,避免多尘环境影 ...

  • 一文读懂腕关节X线阅片技巧:影像医生千万别漏诊!

    相对肩关节脱位等,腕关节脱位临床相对会少见一些.腕关节脱位系由于组成腕掌关节各骨的关节面,失去正常对位关系,正因为腕部特殊的解剖结构,导致临床医师有时候会有漏诊的可能. 一.腕关节解剖 腕关节解剖范围 ...