Анализ журнала: поиск строк по разнице во времени

У меня есть длинный файл журнала, созданный с log4j10 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

Apache Chainsaw имеет столбец дельты времени.

Другие вопросы по тегам