首先,在 Nginx 日志末尾添加 $request_time 把响应时间到日志中。
PV
统计 PV,就是日志行数。
[root@izwz9gnho9y85rrwrrr7v2z log]# cat access.log |wc -l
53102
UV
UV, 即是统计 IP 数。
[root@izwz9gnho9y85rrwrrr7v2z log]# cat access.log |awk '{print $1}' |sort |uniq -c |wc -l
2886
注意,uniq -c,去重并在输出行前面加上每行在输入文件中出现的次数,必须先排序一次,它是逐行比较,遇到下一行不相同次数就恢复1了。
访问最频繁的IP
IP 出现次数从高到低。
[root@izwz9gnho9y85rrwrrr7v2z log]# cat access.log |awk '{print $1}' |sort |uniq -c |sort -rn |head
7766 219.132.139.37
4472 113.64.105.9
2981 116.5.142.176
2139 113.64.102.24
1356 113.81.2.143
1352 113.64.101.143
1206 113.87.195.185
1192 183.25.126.220
1079 183.25.125.144
1064 113.64.102.172
sort -nr, n 按数值来排序(而不是ascii码值),r 倒序,大的在前。
访问最频繁的URI
URI 出现次数从高到低。
[root@izwz9gnho9y85rrwrrr7v2z log]# cat access.log |awk '{print $7}' |sort |uniq -c |sort -rn |head
6310 /api/user-push-message
3553 /
2484 /api/homepage-today-recommendgoods?title=&sort=&page=1&pagesize=10
2484 /api/homepage-pintuan?title=&sort=&page=1&pagesize=2
2482 /api/homepage-hot-salerecommend?title=&sort=&page=1&pagesize=2
2326 /api/homepage?page=1
2094 /api/lucky-draw/1
1379 /api/profile
1248 /api/collectAndViewhistory
1175 /api/homepage
状态码分布情况
[root@izwz9gnho9y85rrwrrr7v2z log]# cat access.log |awk '{print $9}' |sort |uniq -c |sort -nr
46217 200
2523 404
1302 500
1223 304
926 401
678 302
254 400
120 "-"
51 157
44 499
30 422
29 206
21 405
12 413
12 403
8 301
4 SP1
3 419
2 408
最耗时的请求发生时间、所请求的 URI 和耗时
[root@izwz9gnho9y85rrwrrr7v2z log]# cat access.log |awk '{print $4,$7,$NF}' |sort -k3 -nr|head
[01/Mar/2019:02:11:32 /api/homepage?page=1 20.542
[11/Feb/2019:05:24:15 /api/collectAndViewhistory?type=2&page=1 10.027
[01/Mar/2019:00:49:22 /api/cate-list?title=%E7%9F%AD%E8%A2%96&sort=&page=3 8.811
[26/Mar/2019:08:41:18 /api/homepage-pintuan?title=&sort=&page=1&pagesize=2 8.493
[03/Mar/2019:09:16:49 /api/homepage?page=1 8.424
[01/Mar/2019:03:44:09 /api/homepage-cheap-goods?title=&sort=&page=2 8.152
[29/Mar/2019:03:05:32 /api/cate-list?title=%E5%9C%A8%E6%B7%98%E5%AE%9D%E5%92%8C%E4%BA%AC%E4%B8%9C%E5%89%8D%E8%AE%B0%E5%BE%97%E5%8F%91%E9%93%BE%E6%8E%A5%E7%BB%99%E6%88%91%E7%9C%8B%E7%9C%8B%E6%88%91%E6%B2%A1%E6%9C%89%E4%BC%98%E6%83%A0%E5%88%B8%E5%93%A6[%E5%A5%B8%E7%AC%91]%E7%9C%81%E9%92%B1%E6%98%AF%E4%B8%80%E7%A7%8D%E5%A5%BD%E4%B9%A0%E6%83%AF%EF%BC%8C%E5%B8%8C%E6%9C%9B%E4%BD%A0%E6%8B%A5%E6%9C%89[%E8%B0%83%E7%9A%AE]&sort=&page=2 7.956
[01/Mar/2019:15:37:50 /api/homepage?page=1 7.876
[18/Feb/2019:02:51:49 /api/items/576998516953 7.744
[04/Mar/2019:03:00:00 /api/collectAndViewhistory 7.474
awk 中 $NF, 表示最后一个字段。sort -k3, 表示依据第3个字段来排序, 默认的字段分割符是空格,如果是其他可以使用 -t 指定。
不同 URI 的平均耗时
[root@izwz9gnho9y85rrwrrr7v2z log]# cat access.log |awk '{s[$7] += $NF;c[$7]++}END{for(i in s){print i,s[i]/c[i]}}' |sort -k2 -nr |head
/api/cate-list?title=%E7%9F%AD%E8%A2%96&sort=&page=3 8.811
/api/cate-list?title=%E5%9C%A8%E6%B7%98%E5%AE%9D%E5%92%8C%E4%BA%AC%E4%B8%9C%E5%89%8D%E8%AE%B0%E5%BE%97%E5%8F%91%E9%93%BE%E6%8E%A5%E7%BB%99%E6%88%91%E7%9C%8B%E7%9C%8B%E6%88%91%E6%B2%A1%E6%9C%89%E4%BC%98%E6%83%A0%E5%88%B8%E5%93%A6[%E5%A5%B8%E7%AC%91]%E7%9C%81%E9%92%B1%E6%98%AF%E4%B8%80%E7%A7%8D%E5%A5%BD%E4%B9%A0%E6%83%AF%EF%BC%8C%E5%B8%8C%E6%9C%9B%E4%BD%A0%E6%8B%A5%E6%9C%89[%E8%B0%83%E7%9A%AE]&sort=&page=2 7.956
/api/items/576998516953 7.744
/api/cate-list?title=%E6%B4%97%E9%9D%A2%E5%A5%B6&sort=&page=2 6.562
/api/cate-list?title=%E4%B9%9D%E9%98%B3JYS-A800%E7%BB%9E%E8%82%89%E6%9C%BA%E5%AE%B6%E7%94%A8%E7%94%B5%E5%8A%A8%E5%A4%9A%E5%8A%9F%E8%83%BD%E7%A2%8E%E8%82%89%E6%90%85%E6%8B%8C%E6%90%85%E8%82%89%E7%BB%9E%E9%A6%85%E6%89%93%E8%82%89%E6%89%93%E8%92%9C%E6%96%99%E7%90%86&sort=&page=2 6.449
/api/homepage-cheap-goods?title=&sort=&page=6 6.243
/api/cate-list?title=%E7%9F%AD%E8%A2%96&sort=&page=4 6.21
/api/cate-list?title=%E7%A0%A7%E6%9D%BF&sort=&page=1 6.078
/api/cate-list?title=%E7%89%9B%E4%BB%94%E8%A3%A4&sort=price_asc&page=2 5.902
/api/cate-list?title=%E7%89%9B%E4%BB%94%E8%A3%A4&sort=price_asc&page=1 5.663
awk 中,s 数组统计 URI 耗时总和,c 数组统计 URI 总请求次数,最后相除。
如果仅考虑 URI 不考虑 query_string,可以使用 split 进行分割截取:
cat access-20191129.log |awk '{split($5,a,"?");print a[1],$NF}' |awk '{s[$1]+=$2;c[$1]+=1}END{for(i in s){print i,s[i]/c[i]}}' |sort -k2 -rn