2014-01-14 169 views
0

我不是在腳本很好結合的awk腳本..爲Apache日誌

我有兩個劇本,第一個是提取我的訪問日誌的最後五分鐘,而第二個是計算apache響應時間的標準偏差,所以我可以創建一個nagios警報。

所以,基本上我需要的是計算Apache的access_log的最後五分鐘的標準偏差。

任何人都可以幫我一下嗎?

腳本一個

x=$((5*60)) 
last=$(tail -n1 access_log|awk -F'[][]' '{ gsub(/\//," ",$2); sub(/:/," ",$2); "date +%s -d \""$2"\""|getline d; print d;}') 

awk -F'[][]' -v last=$last -v x=$x '{ gsub(/\//," ",$2); sub(/:/," ",$2); "date +%s -d \""$2"\""|getline d; if (last-d<=x)print $0 }' 

腳本2

awk '{x[NR]=$11; s+=$11} END{a=s/NR; for (i in x){ss += (x[i]-a)^2} sd = sqrt(ss/NR); print "SD = "sd}' access_log 

哎呀,我已經想通了,問題是第二個腳本實際上解析錯行,所以我的連接提前

正確的腳本

# this variable you could customize, important is convert to seconds. 
# e.g 5days=$((5*24*3600)) 
x=$((5*60)) #here we take 5 mins as example 

# this line get the timestamp in seconds of last line of your logfile 
last=$(tail -n1 access_log2|awk -F'[][]' '{ gsub(/\//," ",$2); sub(/:/," ",$2);   "date +%s -d \""$2"\""|getline d; print d;}') 


awk -F'[][]' -v last=$last -v x=$x '{ gsub(/\//," ",$2); sub(/:/," ",$2); "date +%s -d \""$2"\""|getline d; if (last-d<=x)print $0 }' access_log2 | 
awk '{x[NR]=$14; s+=$14} END{a=s/NR; for (i in x){ss += (x[i]-a)^2} sd = sqrt(ss/NR); print "SD = "sd}' 

謝謝

+2

可不可以給一些樣品輸入或日誌,以及關於你在哪裏有點解釋卡住? – fedorqui

+1

請注意,在第二個腳本中,您將每個響應時間存儲在一個數組中,因此您可以獲得一個潛在的巨大數組。你可以通過存儲時間平方的運行總和來避免這種情況,並用平均數的平方來做一些簡單的數學運算。 –

+0

順便說一下,我認爲你的第二個腳本適用於我(平均文件大小,導致我的日誌不打印響應時間) –

回答

1

避免獲得EPOC時間,這裏是我的建議,以簡化您的問題。

首先,獲得5分鐘的時間與以下格式之前:

MIN=$(date -d "-5 minutes" +%Y%m%d%H%M%S) 

例如,輸出的時間會是這樣的:20140114023124

可以5天前設置,或其他時間,隨你喜歡。

然後在awk或其他格式中重新設置access_log [14/Jan/2014:02:36:50 +0100]的時間部分,您應該得到20140114023650並與$ MIN比較,如果超過$ MIN,則將其打印出來。

因此,腳本將(導出5分鐘內生成的日誌)。

MIN=$(date -d "-5 minutes" +%Y%m%d%H%M%S) 
awk -F'[][]' -v m=$MIN '{ gsub(/\//," ",$2); sub(/:/," ",$2); "date +%Y%m%d%H%M%S -d \""$2"\""|getline d; if (d>=m) print }' access_log 

您可以將標準偏差計算爲awk命令,或者只是導出到存在代碼:awk '{x[NR]=$14; s+=$14} END{a=s/NR; for (i in x){ss += (x[i]-a)^2} sd = sqrt(ss/NR); print "SD = "sd}'