这里使用的工具是 阿里巴巴开源工具 arthas,在这里做几个简单的工具使用说明和示例。
前期准备:
- 官方文档地址:https://alibaba.github.io/arthas/quick-start.html
- 测试使用demo(横云断岭):https://github.com/hengyunabc/spring-boot-inside
- 工具:https://github.com/alibaba/arthas/releases
开始操作:
我是在windows下操作演示的。linux请参考官方文档或其他示例
- 首先: 拉取demo代码到本地,运行起来。
- 进入命令窗口 使用jps,可以看到,demo已经运行起来了(如果jps命令无效、不识别,但是java -version生效,就重新配置环境变量,或者将环境变量的相对路径配置为绝对路径)
- 启动arthas工具,-jar 方式进行启动,这里第四个进程是demo进程,输入4然后回车
此时工具已经启动成功。现在可以在命令行模式下操作,也可以通过浏览器的方式进行访问
- arthas 有很好的历史命令提示功能,通过上下方向键进行查找,也可以对输入前缀命令进行历史命令补全
- tab 进行命令补全
命令示例演示:
watch:
方法执行数据观测,让你能方便的观察到指定方法的调用情况。
能观察到的范围为:
返回值
、抛出异常
、入参
,通过编写 OGNL 表达式进行对应变量的查看。
watch com.example.demo.arthas.user.UserController * '{params,throwExp}' -e
观察指定的类(UserController),输出执行函数的入参和返回结果:
*:所有函数
params:入参
throwExp:异常
通过页面调用抛出异常方法,可以看到,内部的入参,返回结果和异常信息。
这里也可以指定将信息输出到文件中 ,默认文件的保存地址,用户路径下logs/arthas-cache
我这里是windows本地启动项目:路径就在项目根路径
watch com.example.demo.arthas.user.UserController * '{params,throwExp}' -e > exp.log
redefine:
加载外部的
.class
文件,redefine jvm已加载的类。。注意, redefine后的原来的类不能恢复,redefine有可能失败(比如增加了新的field),参考jdk本身的文档。
这里是将代码变更后编译新的class文件,替换掉路径下的原有class文件。然后执行命令对jvm中加载的类进行替换。
redefine E:/EDU-WORKSPACE/spring-boot-inside-master/demo-arthas-spring-boot/target/classes/com/example/demo/arthas/user/UserController.class
ognl :
执行ognl表达式
调用静态函数,在控制台进行输出:
ognl '@java.lang.System@out.println("hello world")'
查看类内属性:现在要查看logger实现方式,属性。
ognl '@com.example.demo.arthas.user.UserController@logger'
再此可以看到实现方式是通过logback,日志级别是空。要找到日志级别就需要继续向上。
可以看到路径在向上走,但是上一级的level还是空,就需要继续向上,.parent。
到该位置就能看到根节点的日志级别,下级的日志级别是集成下来的。
修改日志level:
获取logger,然后拿到类中静态字段DEBUG,setLevel更改日志级别。
ognl '@org.slf4j.LoggerFactory@getLogger("root").setLevel(@ch.qos.logback.classic.Level@DEBUG)'
可以看到,日志级别已经变更为debug。(调试完整记得将级别修改回去)
查看当天日志使用的是哪个配置文件:
ognl '#map1=@org.slf4j.LoggerFactory@getLogger("root").loggerContext.objectMap,#map1.get("CONFIGURATION_WATCH_LIST")'