动态修改LOGGER日志级别

简介: 大多数情况下,我们会在打印日志时定义日志的LOGGER级别,用来控制输出的信息范围。一方面,过多的输出会影响查看日志的效率,另一方面,过少的日志让问题定位变得困难。但当线上出现问题时,线上容器通常定义在info级别,发生一些疑难问题时,光靠info级别的日志很难定位问题。一个典型的场景:在一些需要打印MySQL语句的场景,如果你正在使用MyBatis框架,由于MyBaits中SQL语句是DEBUG级别的信息,通常在线上容器就没法看到。


前言



大多数情况下,我们会在打印日志时定义日志的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信息会对线上服务造成实质性的影响。

效果演示:

网络异常,图片无法展示
|

本文内容重点:

  • Arthas工具简介
  • 本地测试:实时修改LOGGER级别
  • 线上实战:实时打印MyBatis SQL语句
  • 总结


Arthas工具简介



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

网络异常,图片无法展示
|

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


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

参考


相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
3月前
|
运维 Linux Windows
[运维技术]PowerShell中实现一个最基本的日志器logger
[运维技术]PowerShell中实现一个最基本的日志器logger
36 1
|
8月前
|
人工智能 监控 Java
SpringBoot实战(十三):Spring Boot Admin 动态修改日志级别
SpringBoot实战(十三):Spring Boot Admin 动态修改日志级别
338 0
|
4月前
|
Java 数据库连接 网络性能优化
动态mapper日志问题
动态mapper日志问题
41 1
|
9月前
|
Java Spring
logger的日志笔记
logger的日志笔记
44 0
|
存储 JSON Prometheus
SpringBoot动态修改日志级别
SpringBoot动态修改日志级别
624 0
SpringBoot动态修改日志级别
|
11月前
|
运维 Linux Windows
PowerShell中实现一个最基本的日志器logger
Powershell 是 IT 运维中绕不过去的一个语言,它不仅能在Windows中使用,同样也适用于Linux。对于运维人员来说,虽然不需要像后端开发人员一样制作日志器以记录大量的生产数据,但也同样存在记录某些运行过程的需求。
138 0
|
Python
Python 日志打印之自定义logger handler
Python 日志打印之自定义logger handler
212 0
springboot之log4j:WARN No appenders could be found for logger
springboot之log4j:WARN No appenders could be found for logger
springboot之log4j:WARN No appenders could be found for logger
|
JSON 安全 数据格式
python接口自动化(四十)- logger 日志 - 下(超详解)
日志是非常重要的,用于记录系统、软件操作事件的记录文件或文件集合,可分为事件日志和消息日志。具有处理历史数据、诊断问题的追踪以及理解系统、软件的活动等重要作用,在开发或者测试软系统过程中出现了问题,我们首先想到的就是她——logging。
200 0
python接口自动化(四十)- logger 日志 - 下(超详解)
|
JSON Java 开发者
python接口自动化(三十九)- logger 日志 - 上(超详解)
Python的logging模块提供了通用的日志系统,可以方便第三方模块或者是应用使用。这个模块提供不同的日志级别,并可以采用不同的方式记录日志,比如文件,HTTP GET/POST,SMTP,Socket等,甚至可以自己实现具体的日志记录方式。
296 0
python接口自动化(三十九)- logger 日志 - 上(超详解)

热门文章

最新文章