標籤:
shell指令碼分析 nginx日誌訪問次數最多及最耗時的頁面(慢查詢)當伺服器壓力比較大,跑起來很費力時候。我們經常做網站頁面最佳化,會去尋找那些頁面訪問次數比較多,而且比較費時。 找到那些訪問次數高,並且比較耗時的地址,就行相關最佳化,會取得立竿見影的效果的。 下面是我在做最佳化時候,經常用到的一段shell 指令碼。 這個也可以算是,統計web頁面的slowpage 慢訪問頁面,象mysql slowquery 。 以下是我的:nginx 配製
log_format main ‘$remote_addr - $remote_user [$time_local] $request ‘
‘"$status" $body_bytes_sent "$http_referer" ‘
‘"$http_user_agent" "$http_x_forwarded_for" $request_time‘;
access_log /var/log/nginx/access.log main buffer=32k;
從上面配置,可以看到:ip在 第一列,頁面耗時是在最後一列,中間用空格分隔。 因此在awk 中,分別可以用:$1$NF 讀取到當前值。 其中NF是常量,代表整個列數。通過awk分析日誌,快捷得到執行時間 一、web記錄檔格式
222.83.181.42 - - [09/Oct/2010:04:04:03 +0800] GET /pages/international/tejia.php HTTP/1.1 "200" 15708 "-" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; Sicent; WoShiHoney.B; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)" "-" 0.037
按照空格分隔的話,最後一個欄位[0.037] 是頁面執行時間,第7個欄位 是頁面訪問地址。
二、執行代碼
awk ‘BEGIN{
print "Enter log file:";
getline logs;
#logs="/var/log/nginx/access.log-20101008";
OFMT="%.3f";
while(getline < logs)
{
split($7,atmp,"?");
aListNum[atmp[1]]+=1;
aListTime[atmp[1]]+=$NF;
ilen++;
}
close(logs);
print "\r\ntotal:",ilen,"\r\n======================================\r\n";
for(k in aListNum)
{
print k,aListNum[k],aListTime[k]/aListNum[k] | "sort -r -n -k3";
}
}‘
結果:效能:422780條日誌,統計完成速度是:5秒左右。
awk 分析web日誌(頁面執行時間)