天天看點

日志檢視技巧之篩選&去重[排查篇]

  引語:相信大家都會偶爾遇到要排查問題發生的原因的情況,那這種時候,我們最有力後盾就是日志檔案了,是以謹記日志記錄真的很重要。但是日志檔案往往是很大的檔案,而且裡面有太多的東西可能不是我們需要的,如無數重複行。如果能夠有效篩選出對我們有意義的記錄,那就太友善了!下面,就記錄一些我篩選日志的一些技巧,供自己和部分需要的新手朋友參考!(高能勿噴,歡迎留下你的高見)

  主要使用awk指令進行篩選!

原始日志php_error.log如下:

[21-Nov-2015 11:10:14 UTC] PHP Warning: PHP Startup: in Unknown on line 0
[21-Nov-2015 11:39:48 UTC] PHP Notice: Undefined index: HTTP_RAW_POST_DATA in E:\wamp\www\htdocs\wx_receiver.php on line 39      

  重定向輸出相關(這個很重要,因為所有列印出來的,你不可能看得完,導出到其他地方後慢慢分析才是硬道理):

$ echo "hello,world!" > out.log        #直接輸出到
$ echo "hello,world!" >> out.log      #以添加的形式輸出到  
$ echo "ssss!" >> out.log 2>&1       #指定錯誤級别輸出到      

  篩選含有warning的記錄:

$ awk '/Warning/' php_error.log
$ awk '{if($0 ~ /Warning/)print $0;}' php_error.log    #完整寫法      

  篩選含Warning後面出現Startup的記錄:

$ awk '/Warning.*?Startup/' php_error.log
$ awk '{if($0 ~ /Warning.*?Startup/)print $0;}' php_error.log  #完整寫法      

原始日志mysql_error.log如下:

[2015-12-20 20:45:51] Error in Mysql::fetch
E:\wamp\www\includes\class\db.cls.php on line 149
E:\wamp\www\htdocs\pp\system\Model.cls.php on line 44
E:\wamp\www\htdocs\pp\controllers\admin\ScoreController.cls.php on line 56
E:\wamp\www\htdocs\pp\system\Application.cls.php on line 72
E:\wamp\www\htdocs\pp\system\Application.cls.php on line 49
E:\wamp\www\htdocs\pp\index.php on line 19

[2015-12-20 20:45:51] mysql_errno: 1054
mysql_error: Unknown column 'score_rule' in 'field list'
E:\wamp\www\includes\class\db.cls.php on line 64
E:\wamp\www\htdocs\pp\system\Model.cls.php on line 43
E:\wamp\www\htdocs\pp\controllers\admin\SeController.cls.php on line 86
E:\wamp\www\htdocs\pp\system\Application.cls.php on line 72
E:\wamp\www\htdocs\pp\system\Application.cls.php on line 49
E:\wamp\www\htdocs\pp\index.php on line 19      

  去除相同行(時間除外),并帶時間行數列印出:

$ awk '{if($1 ~ /^\[[[:digit:]]{4}-/){t=$0;}else{if(!a[$0]++)print NR, " ===> ", t, " ", $0;}}' mysql_error.log      

  其他類似情況,請詳細了解正規表達式寫法。

  直接檢視原始mysql-bin-log日志(binlog是二進制檔案,檢視不了,需借助mysqlbinlog工具):

$ mysqlbinlog mysql-bin-log.000038 > out.log 2>&1      

  統計某檔案夾下的檔案行數:

grep -r -c ./* "<?php" | wc -l
grep -r -l "<?php" ./thinkphp/* | xargs cat | wc -l    #more perfect

wc -l *
find . -name "*.java" | wc -l 
find . -name "*.java" | wc -l | grep total      

  對于字元一類的處理,awk,sed等指令是相當友善的,适當運用一下,對于工作還是挺友善的。但是這種東西用多了,往往在windows的工具下,也有這種操作的想法,但是絕對沒有這麼友善,可以使用一些簡單的正則進行比對一些字元,也還是提高查找速度的!

  正則:好東西!

  關鍵:找特征,寫規則,極簡化!

  注意:各個語言的具體描述,可能不同!

diff file1 file2        #比較兩個檔案的差異
cat file.txt | sort > file.txt  #讓檔案内容按字母排序      

統計代碼行數:

find . -name '*.java' | xargs cat | wc -l      

不要害怕今日的苦,你要相信明天,更苦!

繼續閱讀