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