要求:
①如果一分钟之内某个ip访问超过100次,就把它找出来
日志局部截图
思路:
①根据日志内容,可以使用split分割,取第一个元素
②找出所有的ip,统计次数
③判断每个ip次数,超过100次,就发邮件
④记录文件指针,给下次读的时候用
⑤等待60秒,重新读取文件
1 import time #引入time模块
2 point=0 #存放的是文件初始的位置,如果不写,会提示point未定义,因为代码是从上往下读取的,第一次并未读取到point,所以我们需要先定义point的初始值
3 while True: #写一个死循环,因为文件是一直在读取中的,60秒重新读取一次
4 with open('access.log',encoding='utf-8') as f: #打开日志文件
5 f.seek(point) #再次打开文件时,获取文件指针的位置
6 ip_info={} #定义一个空字典,存放ip和他出现的次数
7 for line in f: #循环日志文件每行内容
8 ip = line.split()[0] #我们需要找到ip,文件内是以空格分割的,所以我们只需要默认split就可以,然后我们找到ip,下标为0的元素
9 #到这一步的时候,我们就可以将文件内的ip全部找出,可以使用print(ip)来查看一下是否实现此功能。
10 if ip in ip_info: #我们需要判断一下ip是否在字典中
11 ip_info[ip]+=1 #ip在字典中,我们就给它在原来的值里+1
12 else:
13 ip_info[ip]=1 #ip如果不在字典中,ip的次数就等于1
14 point=f.tell() #循环结束后,tell()表示获取当前指针的位置
15 for k in ip_info: #循环ip_info每一行数据
16 if in_info.get(k)>=100: #判断如果ip_info[k]的值大于等于100次
17 print('该ip正在攻击你!%s'%k) #输出
18
19 time.sleep(60) #停止60秒,等60秒之后再继续运行