分析nginx错误日志

分析nginx错误日志

我正在寻找一种方法来实现以下目标。

这是 nginx 错误日志中的一行。

2014/12/29 21:17:57 [error] 30078#0: *311826 openat() "/var/www/html/images/images/Outlet-Celine-Boston-Square-Calfskin-Bags-Red_celine_2140_1.jpg" failed (2: No such file or directory), client: 207.46.13.42, server: server.domain.tld, request: "GET /images/images/Outlet-Celine-Boston-Square-Calfskin-Bags-Red_celine_2140_1.jpg HTTP/1.1", host: "www.buylvneverfullpm.net"

还有数千个,所以我需要一种方法:

  1. 查找一行是否包含 'host: "*"',其中 * 是 url
  2. 获取主机的值:“www.xxx.yyy”
  3. 去掉开头的 www
  4. 计算每个 xxx.yyy 出现的次数
  5. 按从最高到最低的顺序对每个唯一主机值的出现次数进行排序。

我一直在使用以下内容:

awk '($20 ~ /GET/)' /var/log/nginx/error_log | awk '{print $24}' | sort | uniq -c | sort -rn

但由于它没有删除“www”,因此存在重复的条目。

答案1

awk为你处理好一切

awk '$20 ~ /GET/{gsub(/"/, "", $24); sub(/[^.]*\./, "", $24); a[$24]++};
END{for (k in a)print k, a[k]}' /var/log/nginx/error_log

相关内容