【问题标题】:Log parsing in Python: Alert if more than N errors in a given period?Python中的日志解析:如果在给定时间段内出现超过N个错误,则发出警报?
【发布时间】:2017-06-19 13:30:36
【问题描述】:

我有一个包含一小时数据的日志文件。

如果该日志中任何 5 分钟内记录的错误超过 N 个,我想生成警报。

不想要做的是指定 5 分钟的时间段(例如 00-05、06-10 等)并遍历它们,因为如果 N=10,我在 04 有 8 个错误,在 07 有 8 个错误,它们将被视为在两个单独的存储桶中,不会生成警报。

我想我可以改为迭代 60 次,每次前进 1 分钟,然后考虑从那一刻开始的 5 分钟存储桶,但有没有更优雅或更高效的方法?

【问题讨论】:

  • 你可以做一个错误队列,一旦有 5 个,你可以比较第一个和最后一个,看看它们是否在 5 分钟内发生

标签: python performance loops time intervals


【解决方案1】:

我会在错误列表上使用滑动窗口(请参阅 Rolling or sliding window iterator in Python 以供参考),然后检查每次迭代是否第一个和最后一个条目在 5 分钟内

示例(来自Rolling or sliding window iterator in 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

【讨论】:

    【解决方案2】:

    我决定接受depperm's comment 中的建议(我希望它已作为答案而不是评论提交,以便我可以将其标记为已接受)。

    看起来像这样:

    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
    

    【讨论】:

    • 如果您有更大的数据,deque 方法可能会更有效
    猜你喜欢
    • 1970-01-01
    • 2016-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多