Анализ журнала: поиск строк по разнице во времени
У меня есть длинный файл журнала, созданный с log4j
10 threads
пишу в лог. Я ищу инструмент анализа журналов, который мог бы найти строки, где пользователь ждал долгое время (то есть, где разница между записями журнала для одной и той же нити превышает одну минуту).
PS я пытаюсь использовать OtrosLogViewer
, но он дает фильтрацию по определенным значениям (например, по идентификатору потока) и не сравнивает строки.
PPS новая версия OtrosLogViewer имеет столбец "Delta", который рассчитывает разницу между соседними строками журнала (в мс)
благодарю вас
3 ответа
Этого простого скрипта Python может быть достаточно. Для тестирования я проанализировал свой локальный журнал Apache, который BTW использует общий формат журнала, так что вы можете даже использовать его как есть. Я просто вычисляю разницу между двумя последующими запросами и печатаю строку запроса для дельт, превышающих определенный порог (1 секунда в моем тесте). Возможно, вы захотите инкапсулировать код в функцию, которая также принимает параметр с идентификатором потока, так что вы можете фильтровать дальше
#!/usr/bin/env python
import re
from datetime import datetime
THRESHOLD = 1
last = None
for line in open("/var/log/apache2/access.log"):
# You may insert here something like
# if not re.match(THREAD_ID, line):
# continue
# Python does not support %z, hence the [:-6]
current = datetime.strptime(
re.search(r"\[([^]]+)]", line).group(1)[:-6],
"%d/%b/%Y:%H:%M:%S")
if last != None and (current - last).seconds > THRESHOLD:
print re.search('"([^"]+)"', line).group(1)
last = current
Основываясь на ответе @Raffaele, я сделал некоторые исправления для работы с любым файлом журнала (пропуская строки, которые не начинаются с запрошенной даты, например, журнал консоли Jenkins). Кроме того, добавлен максимальный / минимальный порог, чтобы отфильтровать линии на основе ограничений продолжительности.
#!/usr/bin/env python
import re
from datetime import datetime
MIN_THRESHOLD = 80
MAX_THRESHOLD = 100
regCompile = r"\w+\s+(\d\d\d\d-\d\d-\d\d \d\d:\d\d:\d\d).*"
filePath = "C:/Users/user/Desktop/temp/jenkins.log"
lastTime = None
lastLine = ""
with open(filePath, 'r') as f:
for line in f:
regexp = re.search(regCompile, line)
if regexp:
currentTime = datetime.strptime(re.search(regCompile, line).group(1), "%Y-%m-%d %H:%M:%S")
if lastTime != None:
duration = (currentTime - lastTime).seconds
if duration >= MIN_THRESHOLD and duration <= MAX_THRESHOLD:
print ("#######################################################################################################################################")
print (lastLine)
print (line)
lastTime = currentTime
lastLine = line
f.closed