Разбор журнала в Python: Оповещение, если больше чем N ошибок в данный период?

У меня есть файл журнала, который содержит данные за час.

Я хотел бы создать оповещение, если в течение 5-минутного периода в этом журнале записано более N ошибок.

Чего я не хочу делать, так это назначать 5-минутные периоды (например, 00-05, 06-10 и т. Д.) И повторять их, потому что если N=10, и у меня 8 ошибок в 04 и 8 ошибок в 07 они будут обрабатываться как в двух отдельных сегментах и ​​не будут генерировать предупреждение.

Я полагаю, что вместо этого я мог бы выполнить итерацию 60 раз, продвигаясь на 1 минуту каждый раз, и рассмотреть 5-минутный интервал с этой точки, но есть ли более элегантный или более производительный способ?

2 ответа

Я бы использовал скользящее окно (см. Итератор скользящего или скользящего окна в Python для справки) над списком ошибок, а затем проверял бы для каждой итерации, если первая и последняя запись находятся в течение 5 минут

пример (из итератора скользящего или скользящего окна в Python):

from collections import deque

def window(seq, n=2):
    it = iter(seq)
    win = deque((next(it, None) for _ in xrange(n)), maxlen=n)
    yield win
    append = win.append
    for e in it:
        append(e)
        yield win

for w in window(errors, 10):
    # if (w[-1]['timestamp'] - w[0]['timestamp']) > 60*5:
    #     error

Я решил воспользоваться рекомендацией в комментарии Депперма (и мне бы хотелось, чтобы он был представлен как ответ, а не как комментарий, чтобы я мог пометить его как принятый).

Это выглядит примерно так:

error_queue = []
max_errors = 3
for log_line in log_lines:
    log_ts = get_timestamp(log_line)
    if contains_error(log_line):
        error_queue.append(log_ts)
        interval_start = log_ts - datetime.timedelta(minutes=5)
        try:
            threshold = error_queue[-max_errors]
        except IndexError:
            continue
        if threshold and threshold >= interval_start:
            raise Exception
Другие вопросы по тегам