1

次のようなTomcatアクセスログがあります。

247.134.70.3 - - [07/May/2012:17:53:58 +0000] 93 "POST /maker/www/jsp/pulse/Service.ajax HTTP/1.1" 200 2 -  "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.2; Trident/4.0; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET4.0C; .NET4.0E)"
247.134.70.3 - - [07/May/2012:17:53:58 +0000] 140 "POST /maker/www/jsp/pulse/Service.ajax HTTP/1.1" 200 2 - "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.2; Trident/4.0; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET4.0C; .NET4.0E)"
... 
...

datetime タイムスタンプの後の数字は、サーバー側の処理時間 ms を示します。「POST /maker/www/jsp/pulse/Service.ajax」などの特定のリクエストの最大時間と平均時間が 10 分間必要です。これはsed、awkを使用して可能ですか、それともPythonなどのより多くのロジックが必要ですか?

ありがとう。

4

2 に答える 2

2
awk -F '[ "]' '{requests[$8 $9] += $6; count[$8 $9]++; if ($6 > max[$8 $9]) {max[$8 $9] = $6}} END {for (request in requests) {print requests[request], count[request], requests[request] / count[request], max[request], request}}' inputfile

別の行に分割:

awk -F '[ "]' '{
    requests[$8 $9] += $6; 
    count[$8 $9]++; 
    if ($6 > max[$8 $9]) {
        max[$8 $9] = $6
    }
} 
END {
    for (request in requests) {
        print requests[request], count[request], requests[request] / count[request], max[request], request
    }
}' inputfile
于 2012-05-15T14:34:36.957 に答える
1
awk -F '[][ ]' -v start="07/May/2012:17:50:00" -v stop="07/May/2012:18:00:00" '
    start <= $5 && $5 < stop {
        split($0, arr, /"/)
        req = arr[2]
        count[req] += 1
        total[req] += $8
        if ($8 > max[req]) max[req] = $8
    }
    END {
        for (req in count) {
            print req
            print "  num entries: " count[req]
            print "  avg time: " total[req]/count[req]
            print "  max time: " max[req]
        }
    }
' logfile

あなたの小さなサンプルを考えると、これは次のように出力します:

POST /maker/www/jsp/pulse/Service.ajax HTTP/1.1
  num entries: 2
  avg time: 116.5
  max time: 140
于 2012-05-15T14:37:39.000 に答える