Linux下Nginx日誌分析

Access logs

以nginx默認的日誌格式爲例:php

$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent"

各字段的含義分別是:nginx

  • $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

輸出樣例:wordpress

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:url

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

輸出樣列:code

21 /members/katrinakp/activity/2338/
19 /blogger-to-wordpress/robots.txt
14 /rtpanel/robots.txt

接下來考慮若是找到這些請求的IP地址,使用命令:blog

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請求(一般是嗅探)rem

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
相關文章
相關標籤/搜索