【Arthas】运行时调整 Java 程序的 logger 日志级别

本文介绍了如何在生产环境中不开启 DEBUG 日志,并利用 Arthas 工具通过两种方式(ognl 命令和 logger 命令)实时更改 Java 程序的日志级别,以便于在不停服的情况下排查问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

生产环境不开启 DEBUG 级别的日志

对于部署到生产环境的程序,我们通常会将其日志级别设置为 INFO。DEBUG 级别的日志一般用于排查异常,而且通常数量较多。很少会有程序在生产环境默认开启 DEBUG 级别的日志。一个正常运行的程序,如果短时间内产生了大量日志,那么很可能是 logger 级别设置不正确。

我也见过有些程序员有意将本应归为 DEBUG 级别的日志用 INFO 级别记录,只是为了在出现业务异常时方便排查原因。当然这也会导致日志文件非常不直观,阅读体验非常差。在业务执行数量较大时,这些 INFO 日志甚至会“冲”掉目标日志。

但很多时候仅靠被持久化的业务数据记录很难排查问题原因,而 DEBUG 级别的日志能更直观得反映程序的运行逻辑。所以很多人会选择将程序的日志等级调整为 DEBUG,重现问题并获得相应日志,再恢复日志等级;这个过程中要保持程序继续运行,不能停服。

 

利用 Arthas 更改 Java 程序的日志级别

Arthas 是阿里推出的一个Java程序诊断工具。它利用 Java Agent 技术对运行中的Java程序进行操作。

我们可以通过 Arthas 来更改目标 logger 的日志级别。

方式1:利用 ognl 命令更改日志级别

Arthas 的 ognl命令 可用于执行 ognl 表达式。这么强大的工具当然可以更改 logger 的日志级别。

示例:

Shell代码

 

  1. ognl '@com.example.demo.arthas.user.UserController@logger.setLevel(@ch.qos.logback.classic.Level@DEBUG)'  

 

方式2:利用 logger 命令更改日志级别

Arthas 的 logger 命令操作更直接:

Shell代码

 

  1. logger --name com.example.demo.arthas.user.UserController --level debug  

注意:目前 Arthas logger 命令实现还不够完善,直接执行此命令可能无法成功。可先执行查看命令再执行更改level命令。

Shell代码

 

  1. logger --name com.example.demo.arthas.user.UserController  

 

为什么 logger 命令这么简单的输入居然能更改日志等级?

其实并没有什么魔法或奇技淫巧,而是 Arthas 在背后默默地做了很多“脏活”。它内部有3个工具类 Log4jHelper、Log4j2Helper、LogbackHelper 分别用于处理 "org.apache.log4j.Logger", "org.apache.logging.log4j.Logger", "ch.qos.logback.classic.Logger" 的操作。LoggerCommand 类中的 level 方法则会用这3个Helper类都执行一遍:

Java代码

 

  1. public void level(CommandProcess process) {  

  2.     Instrumentation inst = process.session().getInstrumentation();  

  3.     boolean result = false;  

  4.     try {  

  5.         Boolean updateResult = this.updateLevel(inst, Log4jHelper.class);  

  6.         if (Boolean.TRUE.equals(updateResult)) {  

  7.             result = true;  

  8.         }  

  9.     } catch (Throwable e) {  

  10.         logger.error("arthas", "logger command update log4j level error", e);  

  11.     }  

  12.   

  13.     try {  

  14.         Boolean updateResult = this.updateLevel(inst, LogbackHelper.class);  

  15.         if (Boolean.TRUE.equals(updateResult)) {  

  16.             result = true;  

  17.         }  

  18.     } catch (Throwable e) {  

  19.         logger.error("arthas", "logger command update logback level error", e);  

  20.     }  

  21.   

  22.     try {  

  23.         Boolean updateResult = this.updateLevel(inst, Log4j2Helper.class);  

  24.         if (Boolean.TRUE.equals(updateResult)) {  

  25.             result = true;  

  26.         }  

  27.     } catch (Throwable e) {  

  28.         logger.error("arthas", "logger command update log4j2 level error", e);  

  29.     }  

  30.   

  31.     if (result) {  

  32.         process.write("update logger level success.\n");  

  33.     } else {  

  34.         process.write("update logger level fail.\n");  

  35.     }  

  36. }  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值