Access logs
以nginx預設的日志格式為例:
$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent"
各字段的含義分别是:
$remote_addr 請求者IP
$remote_user HTTP授權使用者,如果不使用Http-based認證方式,其值為空
[$time_local] 伺服器時間戳
"$request" HTTP請求類型(如GET,POST等)+HTTP請求路徑(不含參數)+HTTP協定版本
$status 伺服器傳回的狀态碼(如200,404,5xx等)
$body_bytes_sent 伺服器響應封包大小,機關byte
"$http_referer" referer字段值
"$http_user_agent" User Agent字段
以下列舉常用的日志分析指令
根據狀态碼進行請求次數排序
cat access.log | cut -d '"' -f3 | cut -d ' ' -f2 | sort | uniq -c | sort -r
輸出樣例:
210433 200
38587 302
17571 304
4544 502
2616 499
1144 500
706 404
355 504
355 301
252 000
9 403
6 206
2 408
2 400
或者使用awk:
awk '{print $9}' access.log | sort | uniq -c | sort -r
上例顯示有704次404請求,接下來是如何找到這些請求的URL
awk '($9 ~ /404/)' access.log | awk '{print $7}' | sort | uniq -c | sort -r
輸出樣列:
21 /members/katrinakp/activity/2338/
19 /blogger-to-wordpress/robots.txt
14 /rtpanel/robots.txt
接下來考慮如果找到這些請求的IP位址,使用指令:
awk -F\" '($2 ~ "/wp-admin/install.php"){print $1}' access.log | awk '{print $1}' | sort | uniq -c | sort -r
輸出樣例:
14 50.133.11.248
12 97.106.26.244
11 108.247.254.37
10 173.22.165.123
php字尾的404請求(通常是嗅探)
awk '($9 ~ /404/)' access.log | awk -F\" '($2 ~ "^GET .*\.php")' | awk '{print $7}' | sort | uniq -c | sort -r | head -n 20
按URL的請求數排序
awk -F\" '{print $2}' access.log | awk '{print $2}' | sort | uniq -c | sort -r
url包含XYZ:
awk -F\" '($2 ~ "ref"){print $2}' access.log | awk '{print $2}' | sort | uniq -c | sort -r