生产环境不开启 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"); } }
相关推荐
Java 诊断利器 Arthas 排查问题实践 Arthas 是 Alibaba 开源的 ... Arthas 是一个功能强大且轻松上手的 Java 诊断工具,开发者可以使用 Arthas 快速诊断和解决 Java 应用程序中的问题,提高开发效率和服务可用性。
2. **动态命令注入**:Arthas支持在运行时向Java应用注入代码,如`expr`命令可以执行任意的Java表达式,`trace`命令可以追踪指定方法的调用路径。 3. **类与方法分析**:`class`命令可以查看类的加载信息,`method`...
5. **JVM信息查看**:`jvm`命令提供了查看JVM运行时信息的功能,包括GC日志、线程堆栈、内存使用等。 6. **热更新**:Arthas支持AOP切面编程,可以实现热更新,对代码进行实时修复。 二、Arthas使用场景 1. **...
Arthas是一款强大的Java诊断工具,它为开发者提供了一种便捷的方式来查看和分析应用程序的运行状态,从而帮助解决各种复杂的运行时问题。基于JAVA的Arthas安装包提供了全面的功能,包括但不限于类加载、方法调用跟踪...
3. **Class操作**:使用`asm`库,可以方便地查看、修改、热替换运行时的Java类,无需重启服务就能实现代码的动态更新。 4. **JVM监控**:Arthas提供了`watch`、`trace`等命令,可以实时监控指定方法的执行,帮助...
8. **arthas.properties**: 配置文件,用于设置Arthas的相关参数,如端口、日志级别等。根据需求,你可以自定义配置以适应不同的环境。 安装和使用Arthas的步骤大致如下: 1. 将压缩包解压到一个合适的目录。 2. ...
5. **日志配置**:`logback.xml`文件用于定义Arthas自身的日志输出格式和级别,方便开发者了解工具运行状态。 6. **服务启动脚本**:`as-service.bat`和`as.bat`分别是Windows和Linux环境下的服务启动脚本,确保...
3. **日志分析**:通过`log`命令,Arthas能够帮助开发者快速定位和分析日志,提供方便的日志级别调整和日志输出控制。 4. **JVM信息查询**:`jvm`命令提供了查看JVM配置和运行状态的功能,包括GC、线程、类加载等...
Arthas,全称为 Alibaba Arthas,是阿里巴巴开源的一款强大的Java诊断工具,专为解决生产环境中的Java应用问题而设计。它提供了多种命令行工具,帮助开发者在不重启服务的情况下进行实时诊断和分析,极大地提高了...
Arthas 的基本原理是使用 Java Agent 实现的,它会在应用程序启动时向 JVM 中注入一个 Java Agent,该 Agent 可以修改字节码,动态地为应用程序增加一些代码。通过这种方式,Arthas 可以在应用程序运行时,动态地...
Arthas开源的Java诊断工具 更新日志:v3.5.1Add vmtool commandRemove the useless resetClassFileTransformer in Enhancer对于非chunk response,返回标准的content-length字段The jvm command may throw ...
Arthas的核心理念是帮助开发者在不重启服务的情况下,实时观察和诊断Java应用程序,从而提高了问题定位的效率。 Arthas提供了多种功能,包括但不限于以下几点: 1. **命令行工具**:Arthas提供了一个基于命令行的...
arthas-boot.jar 阿里的Java程序诊断工具
它提供了丰富的命令行工具,帮助我们更好地理解和优化Java应用程序的运行状态。"火焰图"是Arthas中一个重要的特性,尤其在性能分析方面发挥着关键作用。 火焰图是一种可视化技术,用于展示程序执行的调用栈。在...
1. **JVM调优**:Java虚拟机(JVM)是Java程序运行的基础,其配置参数对程序性能有着显著影响。了解如何调整堆内存大小(如新生代、老年代)、方法区、栈空间等,以及垃圾收集器的选择(如CMS、G1、ZGC等),都是...
这部分文档可能涉及Arthas的日志管理功能,如何在运行时动态调整日志级别,查看和控制应用的输出日志。 10. **advanced-use.html**: 高级使用部分可能涵盖了更复杂的使用场景和技巧,如自定义脚本、插件开发等,...
arthas工具,用于java内存马排查
Arthas提供了一个名为watch的命令,可以实时查看应用程序的运行时信息。例如,使用watch命令可以查看Mybatis数据库查询消耗了多少时间,并且可以组合params, target, returnObj, method, clazz等信息。 2. 动态...
Arthas的核心功能包括:查看类加载信息、查看方法调用次数和耗时、查看运行时变量、修改运行时变量、执行任意Java代码、热更新代码等。这些功能使得开发者在遇到问题时,可以迅速定位并解决,提高了开发效率。 **...