紫風亂寫

          除了他眼前的屏幕,這個人什么也沒看見。
          被周圍的電腦簇擁著,他只知道他所創造的現實,但又意識到那是虛幻。
          他已經超越了技術。也超越了機器。
          posts - 62, comments - 93, trackbacks - 0, articles - 0
            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

          1. 說明

          作為一個程序員我們經常要做一件事情:獲取某個Log文件,從其中找出自己想要的信息。本文總結了我在工作中使用了哪些工具來分析Log文件獲取我想要的信息,我最近幾年的工作環境都是服務器在Linux上,工作機是Windows, 所以我用的工具主要是Linux上的一些命令行工具,當然他們在Windows上也可以用,具體看下面的工具篇。
          先聲明,我只是非常普通的Linux用戶,所以如果有些Linux命令或者工具用的不高效,請大家教育我。

          題外話:我的觀點是作為一個Java程序員,只需要在自己工作所需要的范圍內了解所使用的操作系統就可以了,成為專家固然好,但是不是必要的,譬如:我天天用Windows,但是始終不知道如何通過編輯組策略或者是注冊表的方式調網絡連接數的最大值,反正幾乎所有的優化工具都有這個功能。

          2. 工具

          • 連接遠程Linux服務器的工具:mRemoteNG官方網站好像被墻了,可以在華軍天極之類的下載
          • Windows上執行Linux命令行的工具:Cygwin或者是Git Bash
          • 如果你倆個都沒有裝的話,我的建議是裝一個Git Bash,基本夠用了,而且安裝簡單方便。
          • 文本編輯器: vi, 偶爾在Windows下用Notepad++
          • 因為一般情況下的Log文件都會有個幾十甚至幾百M,用vi直接查看比較直接,而且打開比較快。
          • 文本分析: Excel, 不過這次在家里寫東西,所以我后面會嘗試一下使用金山WPS 中的 WPS表格

          3. 分析Log

          3.1 搜索文本

          分析Log首先就是找到你所需要的Log,一般情況下我們所需要的Log是這么定位的

          1. 根據異常信息或者請求信息找到對應的那一行
          2. 根據該行的時間、線程名稱、關鍵字等信息找到上下文中相關的Log

          下面我們分別說一下上面這兩步應該如何做

          3.1.1 找到對應的那一行,那一些文件

          一般情況下我們在開始分析Log的時候會有這些信息輔助我們進行搜索

          • 出錯時候的參數
          • 出錯時候的異常信息
          • 時間
          • 如果什么信息都沒有,就只知道出錯了,那么我們可以嘗試一下搜索"Error"、"Warn"、"Exception"之類的

          3.1.1.1 如果知道Log是在某一個具體的文件的話

          我一般是使用vi 只讀模式打開該文件(假設該文件名為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命令例子如下:把搜索結果打印到屏幕上,用空格鍵翻頁
          grep -nR "Hello World" ./*.log | more
          把搜索結果打印到文件helloWorld.log中
          grep -nR "Hello World" ./*.log > helloWorld.log

          3.1.2 找上下文

          按照上面的步驟,找到線索了,如果干擾信息不多的話,你上下瀏覽可以了。那么如果干擾信息較多,我一般通過綜合使用以下幾種方式來獲取自己所需要的不帶干擾信息的日志。

          • 根據該請求的線程名稱、關鍵字來過濾出自己所需要的Log
          • 我一般使用使用上面的grep命令來做
          • 根據一個分析出來的起始和結束時間(如一個web請求的進入和結果信息的寫回時間)來得到該時間段內所有的日志。
          • 我一般先使用vi打開,然后找到所需要的內容的第一行的行號和最后一行的行號,然后使用sed命令獲取其中的幾行。下面的這個命令的結果是把source.log中的第200行到266行的內容保存到result.log文件中。
            sed -n 200,266p source.log > result.log

          3.2 日志分析

          除了在Log中發現線索之外,有的時候還需要對日志進行批量的分析,我碰到過的比如分析某種錯誤出現的時間、出現該錯誤的相關的id等等。需要用到一些統計之類的東西。

          3.2.1 簡單情況

          簡單的我一般把每個場景萃取一行到一個文件中,然后使用wc(別笑,它是word count的縮寫)命令來計算行數,如下所示
          wc -l result.log
          復雜的我一般是使用Excel或者是金山WPS來進行文件分析。

          3.2.2 使用Excel或者金山WPS進行文件分析

          1. 首先是先新建一個工作表
          2. 然后把要分析的文本拷貝進去
          3. 然后反復的使用 *分列* (菜單:數據->分列)功能把日志文件拆分成一個表格
          4. 然后再使用過濾排序數據透視圖等功能來進行分析

          3.3 其他一些有用的命令

          • 打開一個日志文件,看著它隨著系統的運行而不斷的更新
          tail -f abc.log
          • 同時監視多個文件的變化
          tail -f ./*.log
          • 看一個文件開頭的20行
          head -20 abc.log
          • 看一個文件結尾的50行
          tail -50 abc.log

          評論

          # re: Java程序員修煉之道 之 Logging(3/3) - 怎么分析Log  回復  更多評論   

          2014-09-19 11:12 by willie
          我一般把日志文件拷貝到本機,然后用notepad++開始找,哇哈哈哈哈。

          # re: Java程序員修煉之道 之 Logging(3/3) - 怎么分析Log  回復  更多評論   

          2014-09-20 18:35 by Justfly Shi
          @willie
          如果文件比較大的時候, 拷貝到本地會很慢,用notepad++打開也會很慢,甚至打不開。

          # re: Java程序員修煉之道 之 Logging(3/3) - 怎么分析Log  回復  更多評論   

          2014-09-25 11:32 by 李金龍
          這是在干啥、、、、

          # re: Java程序員修煉之道 之 Logging(3/3) - 怎么分析Log  回復  更多評論   

          2014-09-25 11:33 by 李金龍
          <a></a>

          # re: Java程序員修煉之道 之 Logging(3/3) - 怎么分析Log  回復  更多評論   

          2014-10-27 11:40 by 網購商城
          不錯,感謝博主的分享

          # re: Java程序員修煉之道 之 Logging(3/3) - 怎么分析Log[未登錄]  回復  更多評論   

          2015-05-12 13:08 by robin
          難得的好文。實用,干練。
          主站蜘蛛池模板: 阜平县| 大埔县| 交城县| 那曲县| 邯郸县| 仁布县| 许昌市| 白河县| 安丘市| 广水市| 德令哈市| 寿宁县| 鄂州市| 松潘县| 乌什县| 罗源县| 邛崃市| 班戈县| 东莞市| 眉山市| 即墨市| 大连市| 汉中市| 山阳县| 丰顺县| 湖南省| 临邑县| 张家川| 全州县| 文水县| 雷波县| 丽水市| 罗甸县| 靖宇县| 陇川县| 哈密市| 五台县| 丽水市| 三门县| 上虞市| 临海市|