`

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

    博客分类:
  • Java
 
阅读更多

生产环境不开启 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 的日志级别。

示例:

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

 

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

Arthas 的 logger 命令操作更直接:

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

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

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类都执行一遍:

public void level(CommandProcess process) {
    Instrumentation inst = process.session().getInstrumentation();
    boolean result = false;
    try {
        Boolean updateResult = this.updateLevel(inst, Log4jHelper.class);
        if (Boolean.TRUE.equals(updateResult)) {
            result = true;
        }
    } catch (Throwable e) {
        logger.error("arthas", "logger command update log4j level error", e);
    }

    try {
        Boolean updateResult = this.updateLevel(inst, LogbackHelper.class);
        if (Boolean.TRUE.equals(updateResult)) {
            result = true;
        }
    } catch (Throwable e) {
        logger.error("arthas", "logger command update logback level error", e);
    }

    try {
        Boolean updateResult = this.updateLevel(inst, Log4j2Helper.class);
        if (Boolean.TRUE.equals(updateResult)) {
            result = true;
        }
    } catch (Throwable e) {
        logger.error("arthas", "logger command update log4j2 level error", e);
    }

    if (result) {
        process.write("update logger level success.\n");
    } else {
        process.write("update logger level fail.\n");
    }
}
分享到:
评论

相关推荐

    arthas-packaging-3.5.2-doc.zip

    这部分文档可能涉及Arthas的日志管理功能,如何在运行时动态调整日志级别,查看和控制应用的输出日志。 10. **advanced-use.html**: 高级使用部分可能涵盖了更复杂的使用场景和技巧,如自定义脚本、插件开发等,...

    Arthas线上应用诊断利器概述.pdf

    Arthas提供了一个名为watch的命令,可以实时查看应用程序的运行时信息。例如,使用watch命令可以查看Mybatis数据库查询消耗了多少时间,并且可以组合params, target, returnObj, method, clazz等信息。 2. 动态...

    当DUBBO遇上Arthas-排查问题的实践.pdf

    在排查问题时,调整日志级别可以帮助我们更好地了解系统的运行状况。Arthas提供了`ognl`命令来执行任意Java表达式,例如动态修改日志级别: ```bash $ ognl '@org.slf4j.LoggerFactory@getLogger("root").setLevel...

    arthas-doc3-5-4.zip

    8. **logger.html**: Arthas支持动态调整日志级别,查看和修改应用的日志配置,这对于排查日志相关的问题十分方便。 9. **advanced-use.html**: 这个高级使用指南可能涵盖了更复杂或不常用的Arthas特性,如脚本编写...

    arthus测试使用技巧

    - 使用`logger`命令动态调整日志级别,以便更好地诊断未授权错误(401)。 #### 五、总结 Arthas作为一款功能强大的Java诊断工具,不仅可以帮助开发者快速定位线上环境中出现的问题,还能在不重启服务的前提下...

Global site tag (gtag.js) - Google Analytics