1. 程式人生 > >【線上問題排查技巧】動態修改LOGGER日誌級別

【線上問題排查技巧】動態修改LOGGER日誌級別

# 前言 大多數情況下,我們會在列印日誌時定義日誌的LOGGER級別,用來控制輸出的資訊範圍。 一方面,過多的輸出會影響檢視日誌的效率,另一方面,過少的日誌讓問題定位變得困難。 但當線上出現問題時,線上容器通常定義在info級別,發生一些疑難問題時,光靠info級別的日誌很難定位問題。 一個典型的場景:在一些需要列印MySQL語句的場景,如果你正在使用MyBatis框架,由於MyBaits中SQL語句是DEBUG級別的資訊,通常在線上容器就沒法看到。 一個醜陋的解決辦法就是在沙箱/預發環境,將log4j.xml中的info改為debug: ``` ``` 然後重新打包部署,再發起請求來除錯程式碼。 甚至在一些無法模擬請求的場景下,還需要將修改灰度至線上環境,大量的debug資訊會對線上服務造成實質性的影響。 **本文簡要介紹如何使用阿里巴巴開源Java除錯工具Arthas,實時修改線上服務的LOGGER級別,從而免去打包再部署的繁雜手續,更快的定位線上問題。** **效果演示:** ![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20201112233913469.gif#pic_center) **本文內容重點:** - Arthas工具簡介 - 本地測試:實時修改LOGGER級別 - 線上實戰:實時列印MyBatis SQL語句 - 總結 > 本文閱讀大概需要:2分鐘 > > 碼字不易,歡迎關注我的個人原創技術公眾號:後端技術漫談(二維碼見文章底部) # Arthas工具簡介 Arthas是阿里開源的Java診斷工具,它的功能可以大致參考下圖: ![](https://gitee.com/qqxx6661/markdown-pic/raw/master/2020-11-11/1605107645986-image.png) 它執行的原理是通過位元組碼生成工具(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,效果如下圖: ![](https://gitee.com/qqxx6661/markdown-pic/raw/master/2020-11-11/1605107653135-image.png) ## 全域性Logger資訊 使用命令: ``` logger ``` ![](https://gitee.com/qqxx6661/markdown-pic/raw/master/2020-11-11/1605107658093-image.png) 可以看到所有logger的資訊,包括其中每個appenders。 使用如下命令,修改名稱為ROOT的logger的日誌級別至debug級別: ``` logger --name ROOT --level debug ``` ![](https://gitee.com/qqxx6661/markdown-pic/raw/master/2020-11-11/1605107665964-image.png) 可以看到多出了debug級別的輸出。 ## 指定類名的logger資訊 在有多個logger的情況下,可以查詢指定名稱的logger ``` logger -n ROOT ``` ![](https://gitee.com/qqxx6661/markdown-pic/raw/master/2020-11-11/1605107671933-image.png) ## 指定classloader的logger資訊 如果需要改變指定類的輸出級別,先要定位到該類的classLoader,然後修改該clasLoader的logger。 使用sc命令檢視你需要改變的類資訊: ``` sc -d cn.monitor4all.miaoshaweb.DynamicLoggerTest | grep classLoaderHash ``` ![](https://gitee.com/qqxx6661/markdown-pic/raw/master/2020-11-11/1605107679904-image.png) 隨後可以通過classLoader找到其對應的logger: ``` logger -c 18b4aac2 ``` ![](https://gitee.com/qqxx6661/markdown-pic/raw/master/2020-11-11/1605107685327-image.png) 然後就可以調整對應的logger日誌級別: ``` logger -c 18b4aac2 --name ROOT --level debug ``` ![](https://gitee.com/qqxx6661/markdown-pic/raw/master/2020-11-11/1605107691234-image.png) ![](https://gitee.com/qqxx6661/markdown-pic/raw/master/2020-11-11/1605107695590-image.png) ## 使用 ongl 命令 此外,Arthas還支援使用ognl來修改日誌級別。但是這種方法對log4j不友好,修改會報錯。並且就算支援的logback/slf4j,也需要複雜的形如`ognl -c @org.slf4j.LoggerFactory@getLogger("root").setLevel()`的命令才能修改,並不是一個很好的辦法。 # 線上實戰:實時列印MyBatis SQL語句 ## 容器內啟動arthas 我的線上容器,是沒有外網訪問許可權的(這種情況蠻常見的),我將全量包解壓在容器內執行: ![](https://gitee.com/qqxx6661/markdown-pic/raw/master/2020-11-11/1605107701024-image.png) ## 列印DEBUG級別的SQL日誌 下圖是沒有DEBUG資訊的一條請求日誌,可以看到只有入參出參的攔截器資訊(INFO級別): ![](https://gitee.com/qqxx6661/markdown-pic/raw/master/2020-11-11/1605107706671-image.png) 使用`logger --name ROOT --level debug`,將SQL語句輸出出來: ![](https://gitee.com/qqxx6661/markdown-pic/raw/master/2020-11-11/1605107711079-image.png) 畢竟,很多時候線上的bug是不小心拼錯SQL導致。 # 總結 文章簡單總結了使用Arthas來動態調整日誌級別的使用方法。在線上環境,能夠有效的提升排查問題的效率。當然Arthas能做的還遠不止於此,更多有趣並且**實用**的功能等待大家的發掘。 # 參考 - https://jueee.github.io/2020/08/2020-08-20-Arthas%E4%B9%8B%E6%9F%A5%E7%9C%8B%E5%92%8C%E4%BF%AE%E6%94%B9%E6%97%A5%E5%BF%97%E7%BA%A7%E5%88%AB/ - https://arthas.aliyun.com/doc/logger.html#appenderlogger - https://juejin.im/post/6844903959195303943 ## 關注我 我是一名奮鬥在一線的網際網路後端開發工程師。 主要關注後端開發,資料安全,邊緣計算等方向,歡迎交流。 ### 各大平臺都可以找到我 - **微信公眾號:後端技術漫談** - **Github:[@qqxx6661](https://github.com/qqxx6661)** - CSDN:[@蠻三刀把刀](http://blog.csdn.net/qqxx6661) - 知乎:[@後端技術漫談](https://www.zhihu.com/people/yang-zhen-dong-1/) - 掘金:[@蠻三刀把刀](https://juejin.im/user/5b48015ce51d45191462ba55) - 騰訊雲+社群:[@後端技術漫談](https://cloud.tencent.com/developer/user/1706868) - 部落格園:[@後端技術漫談](https://www.cnblogs.com/rude3knife/) - BiliBili:[@蠻三刀把刀](https://space.bilibili.com/18324091) ### 原創文章主要內容 - 後端開發實戰 - Java面試 - 設計模式/資料結構/演算法題解 - 讀書筆記/逸聞趣事/遊戲人生 ### 個人公眾號:後端技術漫談 ![個人公眾號:後端技術漫談](http://ww1.sinaimg.cn/large/8de6a3d3gy1genhmip8aqg20go0gojz5.gif) **如果文章對你有幫助,不妨點贊,收藏