如何计算 nginx 日志的最大平均响应时间?

如何计算 nginx 日志的最大平均响应时间?

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 服务器配置的日志文件格式,或者每行的最后几个字段是什么。

相关内容