Arthas
(阿尔萨斯)是Alibaba开源的Java诊断工具,深受开发者喜爱。
当你遇到以下类似问题而束手无策时,Arthas
可以帮助你解决:
Arthas
支持JDK 6+,支持Linux/Mac/Windows,采用命令行交互模式,同时提供丰富的 Tab
自动补全功能,进一步方便进行问题的定位和诊断。
前面说了 Arthas
是阿里开源的 Java 诊断工具,所以它是一个项目,可以打成 jar 包部署在服务器运行。
下面我就以 window 上运行 jar 包为例进行演示。
(安装我们就省略,直接从官网下载 jar 包进行使用即可)
Linux 安装可以参考官网:https://arthas.aliyun.com/doc/install-detail.html
命令:$ java -jar xxx.jar
$ java -jar arthas-boot.jar
可以看到我们启动的 demo-test.jar
Java 项目,前面有个 index
标识 4;所以我们输入 4 + Enter 即可指向我们要操作的项目。
启动成功,arthas
提供一个web操作界面,在游览器地址栏输入:127.0.0.1:3658
即可打开。
至此,我们准备工作就已完成,接下来我们就在这个 Web 界面进行命令操作。
基础命令
可以看到,Arthas
提供的命令非常多,功能也非常强大;可以对 JVM 的运行进行管理、可以查看 stack 虚拟机栈等等。
使用这个命令能够将 .class
字节码文件,反编译成我们源代码;一般用于查看 JVM 加载执行的类,是否是我们所期望的类。
命令:jad 类全路径类名
如:jad com.cqeec.demo.controller.DemoController
可以看出,我们在代码中 System.out.println("--111--")
这段话,那我们在游览器进行请求这个控制方法。
http://localhost:12323/demo/test
已经输出成功。
那假如我们在线项目出了错,但是这个项目是正式环境运行着的项目,不能停,但是我怀疑变量的数据有问题,所以需要修改代码追加日志怎么办?
能够想到的就是本地修改源代码,追加日志,然后重新发版;这样太繁琐了,所以 Arthas
就是来干这个事儿的。—— 在不停止项目的情况下,手动替换 JVM 中的 .Class
文件,达到修改代码的功能。
作用:加载外部的.class
文件,retransform(重新转换) jvm已加载的类。
首先需要准备一个修改代码后的 .Class
文件。
@GetMapping("/test")
public void test() {
// 原先代码给注释掉
// System.out.println("---------111----------");
// 新增代码
String name = "zhangSan";
System.out.println(name);
}
利用 IDEA 将修改后的 .java
文件编译为字节码文件
使用 retransform
命令进行字节码文件的替换
寻找编译后的字节码文件
替换操作说明
命令:$ retransform 编译后的字节码文件地址
例如:$ retransform D:/code/demo-test/target/classes/com/cqeec/demo/controller/DemoController.class
注意:必须是正斜杠才能识别。
执行命令
成功,我们再次游览器启动控制方法,看输出结果是否为 zhangSan
。
成功! (注意我们全程没有重启 demo-test.jar 服务)
以上我们追加日志就成功了。
删除指定 retransform entry(条目)
显式触发 retransform
删除所有 entry 之后,重新加载被修改的类
命令:$ retransform --classPattern 类的全路径类名
再次游览器请求,查看输出结果。
恢复了!
以上就是追加日志的全过程!
只支持 spring boot 2
<dependency>
<groupId>com.taobao.arthasgroupId>
<artifactId>arthas-spring-boot-starterartifactId>
<version>3.5.1version>
dependency>
# arthas配置
arthas:
# arthas连接ID
agent-id: demo-test
# atthas 服务连接地址
tunnel-server: ws://127.0.0.1:7777/ws
默认情况下,arthas tunnel server的web端口是8080
,arthas agent连接的端口是7777
从Github Releases页下载: https://github.com/alibaba/arthas/releases
下载后直接启动:$ java -jar arthas-tunnel-server-3.5.1-fatjar.jar
这里就直接使用 IDEA 启动了(要达成 jar 包启动也可以的)
项目启动后,打开 Arthas
提供的 Web 界面:http://127.0.0.1:8080/,使用项目中配置的 agent-id
,将 Arthas
连接到服务。
连接成功。
这样我们只需要在服务器部署一个 arthas-tunnel-server-3.5.1-fatjar.jar
,就可以很方便的支持多个 Java 服务的 Arthas
调试了。
自此,使用 Arthas
追加日志就已经实现;Arthas
还有很多强大之处,慢慢探索!
技术来源于生活!