다음 Apache 로그 형식이 있습니다.
LogFormat "%h %l %u %t \"%r\" %>s %b %D \"%{Referer}i\" \"%{User-Agent}i\""
where's %D
- 요청을 처리하는 데 걸린 시간(마이크로초)입니다.
최근 10초의 평균 응답 시간을 구하는 방법을 알고 싶습니다. 스크립트 등은 어떻게든 지난 10초 동안의 요청 수를 계산하고 응답 시간을 요약해야 합니다. 결과는 number_of_requests_for_last_10_Seconds / sum_of_request_time_for_last_10_Seconds여야 합니다.
이것이 awk 또는 다른 것과 관련이 있을 수 있습니까? 감사해요
고쳐 쓰다
로그 샘플:
93.182.72.47 - - [19/Aug/2014:02:24:19 -0700] "GET /test/085 HTTP/1.1" 200 1006 445 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:31.0) Gecko/20100101 Firefox/31.0"
119.232.112.148 - - [19/Aug/2014:02:24:19 -0700] "GET /test/003 HTTP/1.1" 200 3 84234 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.143 Safari/537.36"
85.244.38.232 - - [19/Aug/2014:02:24:19 -0700] "GET /test/332 HTTP/1.1" 200 3 75760 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.125 Safari/537.36"
236.131.91.87 - - [19/Aug/2014:02:24:16 -0700] "GET /test/006 HTTP/1.1" 200 32 3640965 "-" "python-requests/2.2.1 CPython/2.7.3 Linux/2.6.32-431.17.1.el6.x86_64"
112.241.72.130 - - [19/Aug/2014:02:24:19 -0700] "GET /test/042 HTTP/1.1" 200 50 1148668 "-" "python-requests/2.2.1 CPython/2.6.6 Linux/2.6.32-431.20.3.el6.x86_64"
업데이트 2
tailf /var/log/httpd/access_log | perl -MTime::Piece -lne '
BEGIN{$threshold = (localtime) - 10}
if (/\[(.*?)\] ".*?" \d+ \d+ (\d+)/) {
$d = Time::Piece->strptime($1, "%d/%b/%Y:%H:%M:%S %z");print $d->datetime." ".$threshold->datetime;
if ($d >= $threshold) {$t += $2; $n++}
}
END{print $t/$n if $n}' /var/log/httpd/access_log
...
2014-08-19T03:54:42 2014-08-19T03:54:27
2014-08-19T03:54:43 2014-08-19T03:54:27
2014-08-19T03:54:43 2014-08-19T03:54:27
2014-08-19T03:54:42 2014-08-19T03:54:27
2014-08-19T03:54:44 2014-08-19T03:54:27
2014-08-19T03:54:44 2014-08-19T03:54:27
2014-08-19T03:54:43 2014-08-19T03:54:27
2014-08-19T03:54:43 2014-08-19T03:54:27
2014-08-19T03:54:43 2014-08-19T03:54:27
2014-08-19T03:54:44 2014-08-19T03:54:27
2014-08-19T03:54:43 2014-08-19T03:54:27
2014-08-19T03:54:44 2014-08-19T03:54:27
2014-08-19T03:54:45 2014-08-19T03:54:27
2014-08-19T03:54:45 2014-08-19T03:54:27
2014-08-19T03:54:44 2014-08-19T03:54:27
2014-08-19T03:54:44 2014-08-19T03:54:27
2014-08-19T03:54:44 2014-08-19T03:54:27
2014-08-19T03:54:44 2014-08-19T03:54:27
2014-08-19T03:54:45 2014-08-19T03:54:27
2014-08-19T03:54:44 2014-08-19T03:54:27
2014-08-19T03:54:44 2014-08-19T03:54:27
2014-08-19T03:54:44 2014-08-19T03:54:27
2014-08-19T03:54:46 2014-08-19T03:54:27
답변1
일반적인 작업은 다음과 같습니다 perl
.
Time::Piece 1.17 이상( perl
5.12 이상):
perl -MTime::Piece -lne '
BEGIN{$threshold = (localtime) - 10}
if (/\[(.*?)\] ".*?" \d+ \d+ (\d+)/) {
$d = Time::Piece->strptime($1, "%d/%b/%Y:%H:%M:%S %z");
if ($d >= $threshold) {$t += $2; $n++}
}
END{print $t/$n if $n}' your-file.log
Time::Piece 1.15 이하는 지원되지 않으므로 %z
호출자의 시간대가 로그 파일의 시간대와 일치한다고 가정하면 다음을 수행할 수 있습니다.
perl -MTime::Piece -lne '
BEGIN{$threshold = (localtime) - 10}
if (/\[([^]]*:\d+).*?".*?" \d+ \d+ (\d+)/) {
$d = Time::Piece->strptime($1, "%d/%b/%Y:%H:%M:%S");
if ($d->datetime ge $threshold->datetime) {$t += $2; $n++}
}
END{print $t/$n if $n}' your-file.log