Java程序員修煉之道 之 Logging(3/3) - 怎么分析Log
Posted on 2014-09-17 23:00 Justfly Shi 閱讀(2802) 評論(6) 編輯 收藏 所屬分類: Java程序員修煉之道1. 說明
作為一個程序員我們經(jīng)常要做一件事情:獲取某個Log文件,從其中找出自己想要的信息。本文總結(jié)了我在工作中使用了哪些工具來分析Log文件獲取我想要的信息,我最近幾年的工作環(huán)境都是服務(wù)器在Linux上,工作機是Windows, 所以我用的工具主要是Linux上的一些命令行工具,當然他們在Windows上也可以用,具體看下面的工具篇。
先聲明,我只是非常普通的Linux用戶,所以如果有些Linux命令或者工具用的不高效,請大家教育我。
題外話:我的觀點是作為一個Java程序員,只需要在自己工作所需要的范圍內(nèi)了解所使用的操作系統(tǒng)就可以了,成為專家固然好,但是不是必要的,譬如:我天天用Windows,但是始終不知道如何通過編輯組策略或者是注冊表的方式調(diào)網(wǎng)絡(luò)連接數(shù)的最大值,反正幾乎所有的優(yōu)化工具都有這個功能。
2. 工具
- 連接遠程Linux服務(wù)器的工具:mRemoteNG官方網(wǎng)站好像被墻了,可以在華軍天極之類的下載
- Windows上執(zhí)行Linux命令行的工具:Cygwin或者是Git Bash 如果你倆個都沒有裝的話,我的建議是裝一個Git Bash,基本夠用了,而且安裝簡單方便。
- 文本編輯器: vi, 偶爾在Windows下用Notepad++ 因為一般情況下的Log文件都會有個幾十甚至幾百M,用vi直接查看比較直接,而且打開比較快。
- 文本分析: Excel, 不過這次在家里寫東西,所以我后面會嘗試一下使用金山WPS 中的 WPS表格
3. 分析Log
3.1 搜索文本
分析Log首先就是找到你所需要的Log,一般情況下我們所需要的Log是這么定位的
- 根據(jù)異常信息或者請求信息找到對應(yīng)的那一行
- 根據(jù)該行的時間、線程名稱、關(guān)鍵字等信息找到上下文中相關(guān)的Log
下面我們分別說一下上面這兩步應(yīng)該如何做
3.1.1 找到對應(yīng)的那一行,那一些文件
一般情況下我們在開始分析Log的時候會有這些信息輔助我們進行搜索
- 出錯時候的參數(shù)
- 出錯時候的異常信息
- 時間
- 如果什么信息都沒有,就只知道出錯了,那么我們可以嘗試一下搜索"Error"、"Warn"、"Exception"之類的
3.1.1.1 如果知道Log是在某一個具體的文件的話
我一般是使用vi 只讀模式打開該文件(假設(shè)該文件名為access.log)進去后讓它顯示一下行號:vi -R access.log
:set nu
跳到第一行:
gg或者是
1G
跳到最后一行:
0G或者是
G
跳到第11行:
11G
從文件頭往后面搜索字符串Hello World:
:/Hello World
從文件尾往前搜索字符串Hello World:
:?Hello World
跳到下一個符合搜索條件的地方:
n
跳到上一個符合搜索條件的地方:
N
vi里面用Go的縮寫字母g跳來跳去, 字母n是Next的縮寫退出vi的命令是:
:q!
3.1.1.2 如果不知道是哪個文件的話
我一般是使用grep命令例子如下:把搜索結(jié)果打印到屏幕上,用空格鍵翻頁grep -nR "Hello World" ./*.log | more把搜索結(jié)果打印到文件helloWorld.log中
grep -nR "Hello World" ./*.log > helloWorld.log
3.1.2 找上下文
按照上面的步驟,找到線索了,如果干擾信息不多的話,你上下瀏覽可以了。那么如果干擾信息較多,我一般通過綜合使用以下幾種方式來獲取自己所需要的不帶干擾信息的日志。
- 根據(jù)該請求的線程名稱、關(guān)鍵字來過濾出自己所需要的Log 我一般使用使用上面的grep命令來做
- 根據(jù)一個分析出來的起始和結(jié)束時間(如一個web請求的進入和結(jié)果信息的寫回時間)來得到該時間段內(nèi)所有的日志。 我一般先使用vi打開,然后找到所需要的內(nèi)容的第一行的行號和最后一行的行號,然后使用sed命令獲取其中的幾行。下面的這個命令的結(jié)果是把source.log中的第200行到266行的內(nèi)容保存到result.log文件中。
sed -n 200,266p source.log > result.log
3.2 日志分析
除了在Log中發(fā)現(xiàn)線索之外,有的時候還需要對日志進行批量的分析,我碰到過的比如分析某種錯誤出現(xiàn)的時間、出現(xiàn)該錯誤的相關(guān)的id等等。需要用到一些統(tǒng)計之類的東西。3.2.1 簡單情況
簡單的我一般把每個場景萃取一行到一個文件中,然后使用wc(別笑,它是word count的縮寫)命令來計算行數(shù),如下所示wc -l result.log復(fù)雜的我一般是使用Excel或者是金山WPS來進行文件分析。
3.2.2 使用Excel或者金山WPS進行文件分析
- 首先是先新建一個工作表
- 然后把要分析的文本拷貝進去
- 然后反復(fù)的使用 *分列* (菜單:數(shù)據(jù)->分列)功能把日志文件拆分成一個表格
- 然后再使用過濾排序數(shù)據(jù)透視圖等功能來進行分析
3.3 其他一些有用的命令
- 打開一個日志文件,看著它隨著系統(tǒng)的運行而不斷的更新
tail -f abc.log
- 同時監(jiān)視多個文件的變化
tail -f ./*.log
- 看一個文件開頭的20行
head -20 abc.log
- 看一個文件結(jié)尾的50行
tail -50 abc.log