2012-05-15 3 views
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)" 
... 
... 

Цифра после даты и времени временной метки указывает на стороне сервера времени обработки мс. Мне нужно максимальное и среднее время для конкретного запроса, например. «POST /maker/www/jsp/pulse/Service.ajax» в течение десяти минут. Возможно ли это с помощью sed, awk или мне нужно что-то с большей логикой, например. питон?

Спасибо.

ответ

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 
+0

Как это работает для конкретных запросов? – dublintech

+0

@dublintech: запрос находится в '$ 8' (тип) и' $ 9' (URL). Массивы индексируются конкатенацией двух значений. В блоке 'END' массив' request' перебирается циклом 'for', каждый индекс присваивается' запросу'. Я не разрешал выбирать один конкретный запрос во время выполнения - он итерации над всеми из них. Я также не смог включить функции, связанные с периодами времени. Ответ glenn jackman может приблизиться к тому, что вам нужно. –

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 

 Смежные вопросы

  • Нет связанных вопросов^_^