前言
大多數情況下,我們會在打印日志時定義日志的LOGGER級別,用來控制輸出的信息范圍。
一方面,過多的輸出會影響查看日志的效率,另一方面,過少的日志讓問題定位變得困難。
但當線上出現問題時,線上容器通常定義在info級別,發生一些疑難問題時,光靠info級別的日志很難定位問題。
一個典型的場景:在一些需要打印MySQL語句的場景,如果你正在使用MyBatis框架,由於MyBaits中SQL語句是DEBUG級別的信息,通常在線上容器就沒法看到。
一個丑陋的解決辦法就是在沙箱/預發環境,將log4j.xml中的info改為debug:
<Root level="info">
<AppenderRef ref="detail"/>
<AppenderRef level="error" ref="error"/>
</Root>
然后重新打包部署,再發起請求來調試代碼。
甚至在一些無法模擬請求的場景下,還需要將修改灰度至線上環境,大量的debug信息會對線上服務造成實質性的影響。
本文簡要介紹如何使用阿里巴巴開源Java調試工具Arthas,實時修改線上服務的LOGGER級別,從而免去打包再部署的繁雜手續,更快的定位線上問題。
效果演示:
本文內容重點:
- Arthas工具簡介
- 本地測試:實時修改LOGGER級別
- 線上實戰:實時打印MyBatis SQL語句
- 總結
本文閱讀大概需要:2分鍾
碼字不易,歡迎關注我的個人原創技術公眾號:后端技術漫談(二維碼見文章底部)
Arthas工具簡介
Arthas是阿里開源的Java診斷工具,它的功能可以大致參考下圖:
它運行的原理是通過字節碼生成工具(ASM字節碼增強),將代理邏輯編織到原來的類里,實現對應的監控調試等功能。
關於Arthas這個工具,之前我寫了一篇完整的總結文章,包括所有功能的使用和原理初探,可以去原文章查看:https://juejin.im/post/6844903998730797070
本地測試:實時修改LOGGER級別
安裝arthas
網絡安裝
在接通外網的環境下,可以使用快速網絡安裝,會從阿里的源拉去全量包。
curl -O https://arthas.aliyun.com/arthas-boot.jar
java -jar arthas-boot.jar
全量安裝
如果本地外網環境不通,比如某些容器內是不允許外網訪問的,那么可以使用預先下載好的全量安裝包,然后解壓后運行包內的jar,使用命令:
java -jar arthas-boot.jar
啟動arthas
我在本地啟動arthas,效果如下圖:
全局Logger信息
使用命令:
logger
可以看到所有logger的信息,包括其中每個appenders。
使用如下命令,修改名稱為ROOT的logger的日志級別至debug級別:
logger --name ROOT --level debug
可以看到多出了debug級別的輸出。
指定類名的logger信息
在有多個logger的情況下,可以查找指定名稱的logger
logger -n ROOT
指定classloader的logger信息
如果需要改變指定類的輸出級別,先要定位到該類的classLoader,然后修改該clasLoader的logger。
使用sc命令查看你需要改變的類信息:
sc -d cn.monitor4all.miaoshaweb.DynamicLoggerTest | grep classLoaderHash
隨后可以通過classLoader找到其對應的logger:
logger -c 18b4aac2
然后就可以調整對應的logger日志級別:
logger -c 18b4aac2 --name ROOT --level debug
使用 ongl 命令
此外,Arthas還支持使用ognl來修改日志級別。但是這種方法對log4j不友好,修改會報錯。並且就算支持的logback/slf4j,也需要復雜的形如ognl -c @org.slf4j.LoggerFactory@getLogger("root").setLevel()
的命令才能修改,並不是一個很好的辦法。
線上實戰:實時打印MyBatis SQL語句
容器內啟動arthas
我的線上容器,是沒有外網訪問權限的(這種情況蠻常見的),我將全量包解壓在容器內運行:
打印DEBUG級別的SQL日志
下圖是沒有DEBUG信息的一條請求日志,可以看到只有入參出參的攔截器信息(INFO級別):
使用logger --name ROOT --level debug
,將SQL語句輸出出來:
畢竟,很多時候線上的bug是不小心拼錯SQL導致。
總結
文章簡單總結了使用Arthas來動態調整日志級別的使用方法。在線上環境,能夠有效的提升排查問題的效率。當然Arthas能做的還遠不止於此,更多有趣並且實用的功能等待大家的發掘。
參考
- https://jueee.github.io/2020/08/2020-08-20-Arthas之查看和修改日志級別/
- https://arthas.aliyun.com/doc/logger.html#appenderlogger
- https://juejin.im/post/6844903959195303943
關注我
我是一名奮斗在一線的互聯網后端開發工程師。
主要關注后端開發,數據安全,邊緣計算等方向,歡迎交流。
各大平台都可以找到我
- 微信公眾號:后端技術漫談
- Github:@qqxx6661
- CSDN:@蠻三刀把刀
- 知乎:@后端技術漫談
- 掘金:@蠻三刀把刀
- 騰訊雲+社區:@后端技術漫談
- 博客園:@后端技術漫談
- BiliBili:@蠻三刀把刀
原創文章主要內容
- 后端開發實戰
- Java面試
- 設計模式/數據結構/算法題解
- 讀書筆記/逸聞趣事/游戲人生
個人公眾號:后端技術漫談
如果文章對你有幫助,不妨點贊,收藏起來~