記一次線上故障:日誌暴漲

前言背景

上週三早上連續受到報警信息,提示某某服務器磁盤滿了,請開發同窗儘快處理!java

二話不說先拿出電腦,分析一下服務器的日誌,發現有這樣的日誌記錄出現了一千三百多萬次linux

msgWorker - thread-16 - xxxMessageListener ... 具體內容省略

因爲以前的日誌裏是不會打印這些消息日誌的,因此,我猜想是否是日誌級別設置錯了。並且這個消息打印的類並不在項目源碼裏,而是依賴的jar包中,問題大概是知道了,應該是日誌依賴jar包衝突了。git

由於系統是線上運行的,因此知道某個類裏採用哪一個日誌框架和使用何種日誌級別都是個問題!不過,還好有阿里的Arthas,讓你能夠輕鬆解決這類線上問題。github

問題排查過程

在這裏插入圖片描述
由於咱們的線上機器都是將arthas集成到docker鏡像裏的,因此只須要啓動arthas程序便可。docker

1. 首先問題日誌的級別和框架

logger --name xxx.xxx.xxx //類的全限定名

在這裏插入圖片描述
能夠看到,該類的級別是DEBUG,同時用的是logback日誌框架,而咱們的應用程序用的log4j,所以能夠判定是日誌依賴衝突。shell

2. 肯定logback來自哪些依賴jar包

sc -d ch.qos.logback.classic.Logger

在這裏插入圖片描述
依賴的jar包可能有不少,可是隻須要找到項目中那些直接引用的jar包便可,最終定位到兩個jar包。服務器

  1. 一個是xxx-client最近有升級,查看升級以前的版本,發現是沒有logback-classic的依賴的。
  2. 另外一個是這個messageListener的jar包,而咱們的pom文件裏只排除了logback-core的依賴。

對應的解決方案也很簡單,新升級的xxx-clieng包,去除logback-core,logback-classic的依賴;原有messageListener的jar包,增長logback-classic的排除,問題解決,整個問題定位過程不超過30分鐘。框架

迴歸正題

做爲java研發工程師,常常會遇到線上問題,不少線上問題的難點在於說,程序的運行時狀態你不清楚,好比:curl

  1. 本文開頭的,日誌jar包衝突致使的,磁盤寫滿問題
  2. 程序邏輯出錯,線上系統沒法debug
  3. 機器頻繁GC,系統運行時詳情

等等,這些問題,arthas均可以幫助你一步一步解決線上問題。jvm

Arthas簡介

安裝

主要有兩種安裝方式

##1.第一種方式 arthas-boot.jar
curl -O https://alibaba.github.io/arthas/arthas-boot.jar
java -jar arthas-boot.jar

## github訪問較慢,可使用國內的gitee
curl -O https://arthas.gitee.io/arthas-boot.jar

##2.第二種方式 as.sh
curl -L https://alibaba.github.io/arthas/install.sh | sh
## 能夠將路徑配置到環境變量,運行便可
./as.sh

安裝完成後,attach到某個java進程上,能夠看到啓動後的界面
在這裏插入圖片描述

Arthas功能分類總結

1.系統運行時指標

## 該命令主要是輸出系統的實時數據,包括線程,內存等,能夠快速瞭解系統情況
dashboard

## jvm類命令,能夠輔助幫助排查jvm相關問題
## 1. 系統環境變量
sysprop 
## 2. jvm環境變量
sysenv 
## 3. jvm參數
vmoption

2. 代碼級別功能

2.1 攔截某個方法,獲取其入參,出參以及異常信息

## params,returnObj, throwExp分別表明入參,出參和異常信息, n,x 表示攔截次數和參數展現深度
watch 類全名 方法名 "{params, returnObj, throwExp}" -n 10 -x 5

在這裏插入圖片描述
2.2 你也能夠對方法路徑進行追蹤,使用trace命令

trace 類全名 方法名 -n 5
## or
stack 類全名 方法名 -n 5

上面兩種方法能夠解決線上運行邏輯的檢查,很是實用!

3. 類加載相關功能

有時,咱們須要知道某個類是由哪一個類加載器加載的,或者說有些動態生成的類,咱們如何知道其源碼內容等,這些跟類加載相關的功能,arthas都有相關的功能支持。

## sc (search class),能夠查找該類由哪些類加載,由哪些包加載
sc -d 類全名
## sm (search method),和上面的命令類似
## jad java class decompile,java類反編譯工具,對於動態代理的類有奇效
jad --source-only 類全名@hashcode
## 你甚至能夠動態修改某個類的源碼,而後從新加載該個類!
jad 反編譯,而後修改源碼文件
mc 編譯java文件,生成.class文件
redefine 從新加載.class文件

其實,arthas還有火焰圖以及ognl表達式相關的功能,可讓你瞭解應用程序存在哪些熱點方法,以及讓你更細緻的瞭解深層的java對象,限於篇幅,有興趣的你們能夠至Arthas官網學習。

IDEA插件

插件名稱:arthas-idea
插件地址:https://plugins.jetbrains.com/search?search=arthas-idea

能夠離線安裝,也能夠在IDE內插件中搜索arthas-idea直接安裝。

好了,本篇文章就結束了,但願搞java的後臺工程師能夠嘗試一下這個生產力工具,遇到線上問題不慌,一步步地解決問題!

相關文章
相關標籤/搜索