前言

大多数情况下,我们会在打印日志时定义日志的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能做的还远不止于此,更多有趣并且实用的功能等待大家的发掘。

参考

关注我

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

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

各大平台都可以找到我

原创文章主要内容

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

个人公众号:后端技术漫谈

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

【线上问题排查技巧】动态修改LOGGER日志级别的更多相关文章

  1. springboot中动态修改logback日志级别

    springboot中动态修改logback日志级别 在spring boot中使用logback日志时,项目运行中,想要修改日志级别. 代码如下: import org.slf4j.Logger; ...

  2. springboot中动态修改log4j2日志级别

    springboot中动态修改log4j2日志级别 在spring boot中使用log4j2日志时,项目运行中,想要修改日志级别. 1.pom.xml依赖: <dependency> & ...

  3. Java程序线上故障排查

    目录 一.Linux 内存和cpu 网络 磁盘 /proc文件系统 二.JVM Java堆和垃圾收集器 gc日志分析 JVMTI介绍 Attach机制 java自带工具 三.三方工具 jprofile ...

  4. Java线上问题排查神器Arthas实战分析

    概述 背景 是不是在实际开发工作当中经常碰到自己写的代码在开发.测试环境行云流水稳得一笔,可一到线上就经常不是缺这个就是少那个反正就是一顿报错抽风似的,线上调试代码又很麻烦,让人头疼得抓狂:而且deb ...

  5. BTrace:线上问题排查工具

    BTrace简介 GitHub地址:BTrace 下载地址:v1.3.11.3 官方使用教程:Btrace使用教程 使用场景 BTrace 是一个事后工具,所谓事后工具就是在服务已经上线了,但是发现存 ...

  6. 线上问题排查神器 Arthas

    线上问题排查神器 Arthas 之前介绍过 BTrace,线上问题排查神器 BTrace 的使用,也说它是线上问题排查神器.都是神器,但今天这个也很厉害,是不是更厉害不好说,但是使用起来非常简单.如果 ...

  7. java:线上问题排查常用手段(转)

    出处:java:线上问题排查常用手段 一.jmap找出占用内存较大的实例 先给个示例代码: import java.util.ArrayList; import java.util.List; imp ...

  8. Java架构师线上问题排查,这些命令程序员一定用得到!

    Java架构师线上问题排查,这些命令程序员一定用得到! 线上问题排查,以下场景,你遇到过吗? 一.了解机器连接数情况 问题:1.2.3.4的sshd的监听端口是22,如何统计1.2.3.4的sshd服 ...

  9. JVM 线上故障排查

    JVM 线上故障排查 Linux 1.1 CPU 1.2 内存 1.3 存储 1.4 网络 一.CPU 飚高 寻找原因 二.内存问题排查 三.一般排查问题的方法 四.应用场景举例 4.1 怎么查看某个 ...

随机推荐

  1. Centos7安装MySQL8.0(RPM方式)

    人生处处皆学问,工作也是如此!过去不止一次在Linux上安装MySQL,可以说轻车熟路,但是写篇文章总结一下,发现有很多细节值得学习! 安装包选择 为什么用rpm? 在Linux系列上安装软件一般有源 ...

  2. linux c 多线程开发

    在开发多线程程序时,当创建的线程数量特别多的时候,就会遇到线程数量的瓶颈. 多线程设置 设置内核参数 kernel.threads-max kernel.threads-max 是 linux 系统允 ...

  3. mysql5.5和5.6的一些区别

    timestamp 5.5中 直接写timestamp不加长度   5.6 中 写的timestamp(3) datatime 5.5中 直接写datetime 不加长度  5.6中 可以添加长度(3 ...

  4. Spring中的一些面试题

    谈谈你对spring IOC和DI的理解,它们有什么区别? IoC [Inverse of Control] 控制反转的概念,就是将原本在程序中手动创建UserService对象的控制权,交由Spri ...

  5. Git hub加载慢?下载慢?浏览慢?几个小技巧让你一键起飞!

    记得,那是一个风和日丽,艳阳高照的夜晚,只因为当初的一次回眸,于是便决然走向了程序员的道路,从此,CV大法心中记,代码伴我身. 这一天,正当我打开电脑准备开开心心的使用CV大法完成任务的时候,却恼人的 ...

  6. 【C语言编程入门笔记】C语言果然博大精深!函数还分内部和外部?

    ۞ 外部函数与内部函数 前面我们讲解了关于函数的调用都是针对同一个源文件中其他函数进行调用的,而在有些情况下,函数也可以对另外一个源文件中的函数进行调用.当一个程序由多个源文件组成时,根据函数是否能被 ...

  7. xpath取其中几个使用position

    from lxml import etree html = ''' <!DOCTYPE html> <html lang="en"> <head> ...

  8. NLP任务梳理总结

    NLP任务 前处理任务 前处理任务的结果可作为下游任务输入的额外特征. POSTa(词性标注) 往模型中输入句子,对每一个token进行词性的识别. 识别出的词性可以用于下游任务. Word Segm ...

  9. BERT模型详解

    1 简介 BERT全称Bidirectional Enoceder Representations from Transformers,即双向的Transformers的Encoder.是谷歌于201 ...

  10. Docker学习笔记之-部署.Net Core 3.1项目到Docker容器,并使用Nginx反向代理(CentOS7)(一)

    上一节演示如何安装Docker,链接:Docker学习笔记之-在CentOS中安装Docker 本节演示 将.net core 3.1 部署到docker容器当中,并使用 Nginx反向代理,部署平台 ...