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

실제로는 많은 웹 서버 로그 파일 분석기 중 하나를 사용해야 합니다(예: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 스크립트는 주어진 요청에 대한 응답 시간이 두 번째 필드( $(NF-1))에 있다는 가정을 기반으로 합니다. nginx 서버에 대해 구성한 로그 파일 형식이나 각 줄의 마지막 몇 필드가 무엇인지 알려주지 않았기 때문에 여기에서 추측해야 합니다.

관련 정보