天天看點

linux分析nginx日志,Linux下Nginx日志分析

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