![如何计算 nginx 日志的最大平均响应时间?](https://linux22.com/image/159504/%E5%A6%82%E4%BD%95%E8%AE%A1%E7%AE%97%20nginx%20%E6%97%A5%E5%BF%97%E7%9A%84%E6%9C%80%E5%A4%A7%E5%B9%B3%E5%9D%87%E5%93%8D%E5%BA%94%E6%97%B6%E9%97%B4%EF%BC%9F.png)
nginx
我想根据每个 api 每小时或分钟计算日志中的最大响应时间和平均响应时间...
nginx.log
样本:
10.1.1.1 - - [25/Aug/2019:05:26:30 +0700] "POST /v2/api/find/outlet/ HTTP/1.1" 200 2667 "-" "okhttp/3.12.0" "118.215.153.47" 0.178 0.178 .
10.1.1.1 - - [25/Aug/2019:05:26:30 +0700] "POST /v2/api/find/outlet/ HTTP/1.1" 200 2847 "-" "okhttp/3.12.0" "189.246.151.188" 0.177 0.178 .
10.1.1.1 - - [25/Aug/2019:05:27:52 +0700] "GET /v2/api/menu/category HTTP/1.1" 401 40 "-" "okhttp/3.12.0" "139.194.84.246" 0.007 0.007 .
10.1.1.1 - - [25/Aug/2019:05:27:52 +0700] "GET /v2/api/user/point HTTP/1.1" 200 152 "-" "okhttp/3.12.0" "202.80.217.172" 0.028 0.028 .
10.1.1.1 - - [25/Aug/2019:05:27:52 +0700] "GET /v2/api/user/destination HTTP/1.1" 200 169 "-" "okhttp/3.12.0" "36.91.42.35" 0.019 0.019 .
10.1.1.1 - - [25/Aug/2019:05:28:52 +0700] "POST /v2/api/transaction/inquiry HTTP/1.1" 200 503 "-" "okhttp/3.12.0" "36.89.234.129" 0.374 0.374 .
10.1.1.1 - - [25/Aug/2019:05:28:52 +0700] "POST /v2/api/transaction/confirm HTTP/1.1" 200 874 "-" "okhttp/3.12.0" "36.89.234.129" 0.394 0.394 .
10.1.1.1 - - [25/Aug/2019:05:28:52 +0700] "GET /v2/api/user/point HTTP/1.1" 200 152 "-" "okhttp/3.12.0" "114.5.147.117" 0.024 0.024 .
10.1.1.1 - - [25/Aug/2019:05:28:52 +0700] "GET /v2/api/menu/category HTTP/1.1" 403 40 "-" "okhttp/3.12.0" "139.194.84.246" 0.003 0.003 .
期望样本如下:
date | api | max| avg
25/Aug/2019:05:26 /v2/api/find/outlet 2847 2757
25/Aug/2019:05:27 /v2/api/menu/category HTTP/1.1 1847 1757
25/Aug/2019:05:28 /v2/api/menu/category HTTP/1.1 1147 1257
我已经尝试过这个awk
但只得到平均值:
awk '/25\/Aug\/2019:18/ {c++} END{print c}' access.log
谢谢
答案1
您确实应该使用众多 Web 服务器日志文件分析器之一(例如https://goaccess.io/正如@Bart所建议的。有一些替代方案的不错的总结7 个适用于 Linux 和 Unix 的出色开源分析软件,谷歌会找到你更多),但是对于快速而肮脏的黑客,你可以使用这样的东西:
awk -v OFS='\t' '
$0 ~ date { max[$7]+=$(NF-1); count[$7]++ };
END {
print "date","api","count","max","avg";
for (i in max) {
print date, i, count[i], max[i], max[i]/count[i] }
}' \
date="25/Aug/2019" nginx.log
基于您的示例的输出是(注意,字段由制表符分隔,而不是空格):
date api count max avg
25/Aug/2019 /v2/api/find/outlet/ 2 0.356 0.178
25/Aug/2019 /v2/api/user/destination 1 0.019 0.019
25/Aug/2019 /v2/api/transaction/inquiry 1 0.374 0.374
25/Aug/2019 /v2/api/user/point 2 0.052 0.026
25/Aug/2019 /v2/api/transaction/confirm 1 0.394 0.394
25/Aug/2019 /v2/api/menu/category 2 0.01 0.005
顺便说一句,上面的 awk 脚本基于这样的假设:给定请求的响应时间位于倒数第二个字段 ( $(NF-1)
) 中。我不得不在这里猜测,因为您没有告诉我们您为 nginx 服务器配置的日志文件格式,或者每行的最后几个字段是什么。