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サーバーログファイルアナライザの1つを使用する必要があります(例:https://goaccess.io/@Bartが提案したように。いくつかの選択肢を含む素晴らしい概要LinuxとUnixのための7つの素晴らしいオープンソース分析ソフトウェア、Google でより多くの情報を見つけることができますが、高速で汚れたハッキン​​グには次の方法を使用できます。

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スクリプトは、与えられた要求に対する応答時間が2番目のフィールド($(NF-1))にあるという仮定に基づいています。 nginxサーバー用に設定したログファイルの種類、または各行の最後のいくつかのフィールドが何であるかを教えていないため、ここで推測する必要があります。

おすすめ記事