1. 程式人生 > >python練習:日誌監控

python練習:日誌監控

需求:
1. 每分鐘監控伺服器日誌,每分鐘請求超過200次,加入黑名單

編寫思路
1. 讀檔案,獲取每行的內容 open readlines
xx.2x.x.x - - [04/Jun/2018:03:44:13 +0800]
2. 找到IP地址,按照空格分割字串,取第一個元素 split
3. 把IP存到字典裡面,每個IP出現一次,IP次數就加1
{'ip1':1,'ip2':2,'ip3':1}
['1xx.xx.xx.xx','xxx.xx0.xx.xx','xx.xx.xx.xx']
4. 判斷IP次數是否大於200,加入黑名單
import time  # 引入time模組
point = 0  # 存放的是檔案初始的位置,如果不寫,會提示point未定義,因為程式碼是從上往下讀取的,第一次並未讀取到point,所以我們需要先定義point的初始值
while True: # 寫一個死迴圈,因為檔案是一直在讀取中的,60秒重新讀取一次 with open('abc.txt', encoding='utf-8') as f: # 開啟日誌檔案 f.seek(point) # 再次開啟檔案時,獲取檔案指標的位置 ip_info = {} # 定義一個空字典,存放ip和他出現的次數 for line in f: # 迴圈日誌檔案每行內容 ip = line.split()[0] # 我們需要找到ip,檔案內是以空格分割的,所以我們只需要預設split就可以,然後我們找到ip,下標為0的元素
# 到這一步的時候,我們就可以將檔案內的ip全部找出,可以使用print(ip)來檢視一下是否實現此功能。 if ip in ip_info: # 我們需要判斷一下ip是否在字典中 ip_info[ip] += 1 # ip在字典中,我們就給它在原來的值裡+1 else: ip_info[ip] = 1 # ip如果不在字典中,ip的次數就等於1 print(ip_info) point = f.tell() # 迴圈結束後,tell()表示獲取當前指標的位置
for k in ip_info: # 迴圈ip_info每一行資料 if ip_info.get(k) >= 200: # 判斷如果ip_info[k]的值大於等於100次 print('該ip正在攻擊你!%s' % k) # 輸出 time.sleep(60) # 停止60秒,等60秒之後再繼續執行