【线上问题排查技巧】动态修改LOGGER日志级别

前言

大多数状况下,咱们会在打印日志时定义日志的LOGGER级别,用来控制输出的信息范围。html

一方面,过多的输出会影响查看日志的效率,另外一方面,过少的日志让问题定位变得困难。java

但当线上出现问题时,线上容器一般定义在info级别,发生一些疑难问题时,光靠info级别的日志很难定位问题。git

一个典型的场景:在一些须要打印MySQL语句的场景,若是你正在使用MyBatis框架,因为MyBaits中SQL语句是DEBUG级别的信息,一般在线上容器就无法看到。github

一个丑陋的解决办法就是在沙箱/预发环境,将log4j.xml中的info改成debug:web

<Root level="info">
    <AppenderRef ref="detail"/>
    <AppenderRef level="error" ref="error"/>
</Root>

而后从新打包部署,再发起请求来调试代码。面试

甚至在一些没法模拟请求的场景下,还须要将修改灰度至线上环境,大量的debug信息会对线上服务形成实质性的影响。算法

本文简要介绍如何使用阿里巴巴开源Java调试工具Arthas,实时修改线上服务的LOGGER级别,从而免去打包再部署的繁杂手续,更快的定位线上问题。sql

效果演示:后端

在这里插入图片描述

本文内容重点:设计模式

  • 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能作的还远不止于此,更多有趣而且实用的功能等待你们的发掘。

参考

关注我

我是一名奋斗在一线的互联网后端开发工程师。

主要关注后端开发,数据安全,边缘计算等方向,欢迎交流。

各大平台均可以找到我

原创文章主要内容

  • 后端开发实战
  • Java面试
  • 设计模式/数据结构/算法题解
  • 读书笔记/逸闻趣事/游戏人生

我的公众号:后端技术漫谈

我的公众号:后端技术漫谈

若是文章对你有帮助,不妨点赞,收藏起来~

相关文章
相关标签/搜索