在Linux/UNIX上分析程序日誌的技巧

http://www.linuxidc.com/Linux/2009-12/23293.htm

我們的應用運行在Linux 上,很多同事對命令行操作有恐懼感,於是爲了分析 Linux 上程序的日誌,採用的是 FTP+Ultraedit 方法。這種方式不方便、實時性不夠,也不夠專業。如果碰到幾百兆甚至上G 的日誌文件,這種分析方式的效率也很成問題,尤其是需要實施跟蹤日誌的情況下。


於是我把在 Linux 上分析程序日誌的幾個常用指令及其配合使用總結一下,希望對大家有所幫助。


指令介紹:


more :


作用:該指令,可以將文件的內容,從前向後,每次一屏,打印到終端屏幕上。


用法:


more filename


顯示一屏信息後,' 空格' 向下翻一屏,' 回車' 向下翻一行,' q ' 退出。


cat :


作用:該指令本來的作用,是將多個文件的內容合併起來,打印到標準輸出,但最常見的用法是顯示一個文件的內容,但文件比較大的情況,屏幕會很快滾動,無法查看有效信息,建議使用 more 。


用法:


cat filename


grep :


作用:打印文件或者標準輸入中符合特定模式的行,該指令是從日誌文件中檢索特定信息的最有效手段。


用法:


1、  基本用法


grep pattern filename


如:


grep "error" catalina.out


可以將 tomcat 日誌 catalina.out 中所有包含 error 的行顯示出來


2、  使用正則表達式


grep -e "pattern" filename


如:


grep -e "[eE]rror" catalina.out


可以將 tomcat 日誌 catalina.out 中所有包含 error 或者 Error 的行顯示出來


3、  常用選項


-i 匹配時忽略大小寫


-n 在打印的行前顯示該行在原文件中的行號


-v 該選項,將 grep 的默認行爲翻轉,打印那些不包含特定模式的行


wc :


作用:統計文件中的行數、字數和字節數


用法:


wc filename


如:


[service@localhost threshold]$ wc nohup.out


9761028   76738200 1672741676 nohup.out


從前到後的三個數分別是行數、字數、字節數。


該指令比較常用的參數是 -l ,這個參數可以只統計行數


[service@localhost threshold]$ wc -l nohup.out


9761028  nohup.out


head:


作用:顯示文件的開頭 N 行


用法:


head -num filename


如:


head -100 catalina.out


顯示 catalina.out 的前 100 行

tail :


作用:顯示文件的最後 N 行,或者實時顯示文件中新增的內容。


用法:


1、  顯示文件最後 N 行


tail -num filename


如:


tail -100 catalina.out


則顯示 catalina.out 文件的最後 100 行


2、  實時顯示文件中新增內容


tail -f filename


如:


tail -f catalina.out


執行該指令,不會直接返回命令行,而是實時打印日誌文件中新增加的內容,這一特性,對於查看日誌是非常有效的。如果想終止輸出,按 Ctrl+C 即可。


Linux/unix 的管道:


管道,顧名思義,你可以把它理解爲一個管子,這個管子連接的是前一個指令的輸出和後一個指令的輸入。管道在命令行上用一個豎線 '|' 表示。


比如 :


echo 'hello world'


在屏幕上打印一行字,而


echo 'hello world' | wc –l


就是把 echo 的輸出送給 wc 指令, wc 指令統計行數,輸出結果爲:


1


組合使用:


通過分析日誌來查找問題,其本質是在日誌中尋找特定的模式,並定位該模式的出現的上下文(一般要求前後 N 行)。在實際應用場景中,我們更多的是組合使用前面介紹的指令,來快速定位對我們有用的日誌信息。


以下場景,我們假定日誌文件名爲 catalina.out


場景一 : 實時跟蹤日誌文件 , 並過濾出包含特定關鍵字的日誌


tail -f catalina.out | grep " 關鍵字 "


以上指令組合 , 將 catalina.out 中新增的日誌實時取出 , 通過管道送給 grep 指令 , grep 指令將其中包含 " 關鍵字 " 的行顯示在 console 上 , 直到用戶按 ctrl+c 退出。管道可以多次連接,所以你可以在後面增加更多的 grep 來得到更加精確的過濾結果。


比如:


tail -f catalina.out | grep " 關鍵字 " | grep -v "debug"


以上指令組合,將顯示所有包含" 關鍵字" 且不包含" debug " 的行。


場景二 :尋找日誌中某個異常的 stacktrace 和前後相關信息

第一步:定位出現異常的行, java 的異常,通常包含 Exception 字樣


grep -n "Exception" catalina.out


該指令的 -n 參數會打印符合條件的行的行號,示例輸出如下:


[itims@localhost logs]$ grep -n "Exception" catalina.out


33642:java.lang.NullPointerException


33910:java.lang.NullPointerException


34213:java.lang.NullPointerException


34523:java.lang.NullPointerException


34597:java.lang.NullPointerException


第二步 : 截取 Exception 所在行的前後各 10 行。


比如我們想關注 33910 行的 NullPointerException , 可以用如下指令 :


head -33920 catalina.out | tail -20


該指令會得到如下輸出 :


[itims@localhost logs]$ head -33920 catalina.out | tail -20


Asia/Shanghai


CN


/usr/local/jdk1.5.0_12/jre


Thu Sep 17 11:13:00 GMT+08:00 2009


17 Sep 2009 03:13:00 GMT


2009-9-17 11:13:00


2009-09-17 11:13:00


java.util.GregorianCalendar[time=1253157180432,areFieldsSet=true,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="GMT+08:00",offset=28800000,dstSavings=0,useDaylight=false,transitions=0,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=1,YEAR=2009,MONTH=8,WEEK_OF_YEAR=38,WEEK_OF_MONTH=3,DAY_OF_MONTH=17,DAY_OF_YEAR=260,DAY_OF_WEEK=5,DAY_OF_WEEK_IN_MONTH=3,AM_PM=0,HOUR=11,HOUR_OF_DAY=11,MINUTE=13,SECOND=0,MILLISECOND=432,ZONE_OFFSET=28800000,DST_OFFSET=0]


null


java.lang.NullPointerException


at itims.share.db.GlobalTransaction.rollback(GlobalTransaction.java:125)


at itims.web.frmwk.NetElementService.deleteNetelement(NetElementService.java:292)


at org.apache.jsp.frmwk.deletene_jsp._jspService(deletene_jsp.java:77)


at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:98)


at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)


at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:331)


at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:329)


at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:265)


at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)


at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:269)


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章