Python 脚本,用于扫描日志文件并在ip在一段时间内(假设为5分钟)出现过多错误(假设为50)时发送警报

Python 脚本,用于扫描日志文件并在ip在一段时间内(假设为5分钟)出现过多错误(假设为50)时发送警报,python,Python,我需要一些关于需要扫描日志文件的python脚本的帮助:该脚本应该识别并返回(或向特定电子邮件地址发送警报)日志文件中在特定时间范围(比如5分钟)内错误过多的IP。脚本应连续运行,并应在每次满足发送电子邮件的条件时发出警报 日志格式为: 2019-09-02 10:11:12 ERROR 10.12.46.2 user1 ... 2019-09-02 10:11:12 INFO message ... 2019-09-02 10:11:12 ERROR unexpected ... 解析、计算

我需要一些关于需要扫描日志文件的python脚本的帮助:该脚本应该识别并返回(或向特定电子邮件地址发送警报)日志文件中在特定时间范围(比如5分钟)内错误过多的IP。脚本应连续运行,并应在每次满足发送电子邮件的条件时发出警报

日志格式为:

2019-09-02 10:11:12 ERROR 10.12.46.2 user1 ...
2019-09-02 10:11:12 INFO message ...
2019-09-02 10:11:12 ERROR unexpected ...
解析、计算日志和发送电子邮件不是问题,但是计算这5分钟间隔的函数如何?我创建了一些示例代码来解决日志解析问题,但没有解决时间间隔要求(还没有),因为我正在寻找一个简单的解决方案,而我所想到的并不是

import re
from collections import Counter, defaultdict
from datetime import datetime


class Logerrors():       #, max_errors=5, interval=60):
    def __init__(self,filename, top_ip, max_errors, interval):
        self.filename = filename
        self.top_ip = top_ip
        self.max_errors = max_errors
        self.interval = interval

    def logs_parsing(self):
        ips = []
        ips_dates = {}
        with open(self.filename) as f:
            for line in f:
                ips_1 = re.search(r'(\d{4}-\d{2}-\d{2}.\d{2}:\d{2}:\d{2}) (ERROR) (\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})',line)
                if ips_1:
                    ips.append(ips_1.group(3))
                    if ips_1.group(3) not in ips_dates:
                        ips_dates[ips_1.group(3)] = [ips_1.group(1)]
                    else:
                        ips_dates[ips_1.group(3)].append(ips_1.group(1))

        count = Counter(ips)                        # Dictionary
        print(count)
        top_count = count.most_common(self.top_ip)  # List of tuple
        #print(top_count)
        print(f'These are the {self.top_ip} most common IPs')
        for k,v in top_count:
            print(f'{k} ----> {v}')
        return ips_dates

    def most_frequent(self, frequencies):
        print(frequencies)

    def main():
        #pass parameters to class
        messages = Logerrors("./logfile.txt", 3, 50, 5)
        frequencies = messages.logs_parsing()
        messages.most_frequent(frequencies)


if __name__=='__main__':
    main()
上面的代码是我的实验的一部分,旨在找出问题所在,但并不符合要求,但这是一个示例输出,可能有助于将问题可视化:

Counter({'10.12.46.2': 2, '10.12.46.4': 2, '10.12.46.5': 2, '10.12.46.3': 1})
These are the 3 most common IPs
10.12.46.2 ----> 2
10.12.46.4 ----> 2
10.12.46.5 ----> 2
{'10.12.46.2': ['2019-09-02 10:11:12', '2019-09-02 10:11:12'], '10.12.46.3': ['2019-09-02 10:11:13'], '10.12.46.4': ['2019-09-02 10:11:14', '2019-09-02 10:11:15'], '10.12.46.5': ['2019-09-02 10:11:16', '2019-09-02 10:11:17']}
我陷入困境的地方是如何以编程方式监视日志文件,以便在5分钟内找到有错误的IP

需要验证的几个想法:

  • log\u parsing
    方法应该有一个while循环,以便持续读取日志(在当前版本中,将读取日志一次),假设脚本应该始终运行,因此始终扫描提供的日志文件

  • 在dict
    频率中:

    {'10.12.46.2': ['2019-09-02 10:11:12', '2019-09-02 10:11:12'],
     '10.12.46.4': ['2019-09-02 10:11:14', '2019-09-02 10:11:15'],
     '10.12.46.5': ['2019-09-02 10:11:16', '2019-09-02 10:11:17']}
    

  • 我有“IPs->错误发生日期列表”的键值对:为了满足要求,我可以在每次迭代时监控和检查每个更新值的键的值长度是否大于50,然后执行一些日期和时间算法来计算是否在5分钟内达到阈值:这是正确的方法还是更简单的方法?

    您可以在一段时间内运行代码使用
    sleep(300)
    循环睡眠5分钟。然后只需搜索最近5分钟内的日志和
    len()
    dict值,并在
    len(50)
    上执行任何操作?我可以,但是我会错过错误计数>50,在两个连续的5分钟间隔内添加错误(例如,在第3分钟和第8分钟之间,51个错误形成相同的IP。谢谢