Python 脚本,用于扫描日志文件并在ip在一段时间内(假设为5分钟)出现过多错误(假设为50)时发送警报
我需要一些关于需要扫描日志文件的python脚本的帮助:该脚本应该识别并返回(或向特定电子邮件地址发送警报)日志文件中在特定时间范围(比如5分钟)内错误过多的IP。脚本应连续运行,并应在每次满足发送电子邮件的条件时发出警报 日志格式为: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 ... 解析、计算
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循环,以便持续读取日志(在当前版本中,将读取日志一次),假设脚本应该始终运行,因此始终扫描提供的日志文件
频率中:
{'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。谢谢