這裏使用的工具是 阿里巴巴開源工具 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 '@[email protected]("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 '#[email protected]@getLogger("root").loggerContext.objectMap,#map1.get("CONFIGURATION_WATCH_LIST")'