python練習:日誌監控
阿新 • • 發佈:2018-11-28
需求: 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秒之後再繼續執行