歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux基礎 >> 關於Linux

Linux命令行下監控網站日志

下面的內容是使用linux作為網站的朋友一定要懂的方法。雖然有N多中工具用於分析例如apache、nginx的訪問日志。但是,任何一種都沒有linux內置命令來的高效、靈活^_^。例如:當你的圖形化系統不起作用的時候(黑客攻擊?!),手裡掌握一些監控、分析日志的腳本顯的尤為重要!下面的代碼可以監控最近的訪客日志,相當有用哦。

一、實時過濾日志

使用 tail -f 命令可以查看日志文件最近新增的部分。不過,實際應用中會存在一些麻煩,你會發現輸出了一大堆內容占滿了整個屏幕。有必要格式化一下這些內容^_^。腳本如下:

#需要將腳本保存起來, $COLUMNS 變量才會有效
#注意: -n10 表示顯示最後10行內容,可以自己修改

deny="`tput bold; tput setaf 1`" #亮紅
high="`tput bold; tput setaf 3`" #亮黃
norm="`tput sgr0`"

tail "$@" -s.1 -f access_log |
grep -Ev --line-buffered -f agents_to_ignore -f files_to_ignore |
sed -u "s/\(.*\) - \[[^]]*\]\(.*\)/\1\2/" | #過濾掉一些字段
#分析google蜘蛛訪問
sed -u \
's#\(.*\) "http://www\.\(google\.[^/]*\).*[?&_]q=\([^&"]*\)[^"]*"#\1 "\2 (\3)" #' |
#過濾不需要的內容
sed -u 's/ HTTP\/1.[01]//;
        s/.NET CLR [0-9.]*//g;
        s/Gecko\/[0-9]*//;
        s/rv:[0-9.]*//;
        s/Mozilla\/[0-9.]* //' |
sed -u "s/^/        /; s/^ *\([ 0-9.]\{15,\}\) -/\1/" | #對齊IP地址
sed -u "s/\(.\{$COLUMNS\}\).*/\1/" | #保證輸出行寬度統一
#高亮顯示 referrer行
sed -u "
s/\([^\"]*\"[^\"]*\" 40[34] [0-9]* \"\)\([^\"]*\)\(\".*\)/\1$deny\2$norm\3/;t;
s/\([^\"]*\"[^\"]*\" [0-9 -]* \"\)\([^\"]*\)\(\".*\)/\1$high\2$norm\3/;t;
"

保存為 tail_access_log 並在shell中調用,相信這個大家都會的了^_^。

二、近期日志高效監控腳本

如果網站流量很大的話,日志文件是相當龐大的。分析這些日志的時候就需要小心處理了,例如:筆者的訪問日志已經有700多MB了,一次性讀取的化會相當的慢,通常我們使用 tac 命令讀取文件最後一部分內容,sed 命令用於結束讀取。腳本如下:

#!/bin/sh

# 返回最近N天內 "NCSA" 格式的 HTTP 日志

days=$1
log="$2"

export LANG=C #加速
export TZ=UTC0

last_log_date=`tail -1 "$log" |
               sed 's#.*\[\([^:]*\):\([^ ]*\) .*#\1 \2#g' |
               tr '/' ' '`
yesterday=`date --date="$last_log_date $days day ago" +"%d/%b/%Y:%H:%M"`

#間隔周期10分鐘
yesterday=`echo $yesterday | cut -b-16`
yesterday="$yesterday[0-9]"

tac "$log" | sed "\#$yesterday#Q"

同樣將腳本保存為get_last_days [天數] [文件名],即可使用。

講了這個這麼多下面來段實例。一般,我們可能會感興趣會有哪些用戶訂閱了我們的rss種子。已經采用何種方式訂閱的,skyfeed、google等等。

#!/bin/sh

export LANG=C #加速
feed="/feed/rss2.xml"

#查看一周內訂閱rss的用戶的訪問情況
./get_last_days 7 access_log |
#過濾rss feed url
grep -F "GET $feed" |
#剔除通過refer訪問rss的站點
grep -vE "pixelbeat.org.*(rv:|MSIE|AppleWebKit/|Konqueror|Opera) .* " |
#獲取 ip地址 & 浏覽器情況
sed 's/\([0-9]*\.[0-9]*\)\.[0-9]*\.[0-9]* .*"\([^"]*\)"$/\1\t\2/' |
#根據浏覽器、用戶網段進行排序
sort -k2 -k1,1 |
#合並
uniq -c |
#忽略單個請求
grep -vE "      1 .*(rv:|MSIE|AppleWebKit/|Konqueror|Opera).*" |
#忽略機器人訪問
grep -vE -f agents_to_ignore |
#合並訂閱用戶
sed '
 s/\([^\t]\)\t.*Firefox.*/\1\tFirefox/;
 s/\([^\t]\)\t.*MSIE 7.0.*/\1\tIE7/;
 s/\([^\t]\)\t.*Opera.*/\1\tOpera/;
 s/\([^\t]\)\t.*Akregator.*/\1\tAkregator/;
 s/\([^\t]\)\t.*Thunderbird.*/\1\tThunderbird/;
 s/\([^\t]\)\t.*Liferea.*/\1\tLiferea/;
 s/\([^\t]\)\t.*Google Desktop.*/\1\tGoogle Desktop/;
 ' |
#顯示浏覽器類型
cut -d"`echo -e '\t'`" -f2 |
#分組
sort |
#計數
uniq -c |
#識別使用google訂閱的用戶
sed 's/\(.*\)\(feedfetcher.html\)\(.*\)id=\([0-9]*\).*/\1\2.\4\3/' |
#計數
sed 's/ *[0-9]* .*\(http[^;]*\).* \([0-9]*\) subscriber.*/     \2 \1/' |
#再次合並處理
uniq -f1 |
#排序
sort -k1,1n |
#對齊
sed "s/^/      /; s/ *\([ 0-9]\{7,\}\) \([^ ].*\)/\1 \2/" |
#截取
sed "s/\(.\{80\}\).*/\1/" #note $COLUMNS not exported
Copyright © Linux教程網 All Rights Reserved