最近在學習計算機網絡,想著跟python結合做一些事情。
這段代碼是一個自動化腳本,它主要有三個功能:
分析日志: 它從你指定的日志文件中讀取內容,并篩選出所有包含特定關鍵字的行。
網絡交互: 它將篩選出的數據打包成 JSON 格式,并通過 HTTP 請求發送到一個指定的 API 地址。
文件管理: 它在完成分析后,會自動將原始的日志文件備份到一個新創建的文件夾中。
這個腳本將所有這些功能整合在一起,實現了從數據處理到網絡通信再到文件管理的一系列自動化操作。
1.代碼
import os
import sys
import json
import shutil
import subprocess
import requests
import redef analyze_and_upload(log_file_path, keyword):"""分析日志文件并上傳匹配結果到API。參數:log_file_path: 日志文件路徑 (str)keyword: 要搜索的關鍵字 (str)"""# 1. 檢查文件路徑是否存在if not os.path.exists(log_file_path):print(f"錯誤: 文件 '{log_file_path}' 不存在。")sys.exit(1)matched_logs = []try:# 2. 讀取文件并使用正則表達式過濾with open(log_file_path, 'r', encoding='utf-8') as f:for line in f:if re.search(keyword, line, re.IGNORECASE):matched_logs.append(line.strip())total_matches = len(matched_logs)print(f"在文件中找到了 {total_matches} 行包含關鍵字 '{keyword}' 的日志。")if total_matches == 0:print("沒有匹配的日志,無需上傳。")returnexcept Exception as e:print(f"讀取文件時發生錯誤: {e}")sys.exit(1)# 3. 準備數據并上傳upload_data = {'keyword': keyword,'total_matches': total_matches,'matched_logs': matched_logs}upload_url = 'https://webhook.site/xxx'headers = {'Content-Type': 'application/json'}try:# 使用requests庫進行POST請求response = requests.post(upload_url, data=json.dumps(upload_data), headers=headers, timeout=10)# 檢查響應狀態碼if response.status_code == 200:print("數據上傳成功。")#print("API響應:", response.json())else:print(f"數據上傳失敗,狀態碼: {response.status_code}")print("響應內容:", response.text)except requests.exceptions.RequestException as e:print(f"請求API時發生錯誤: {e}")# 如果你正在調試,可以在這里打印更詳細的錯誤# print(f"請求API時發生錯誤: {e.__class__.__name__} - {e}")# 4. 備份文件try:backup_dir = 'log_backups'if not os.path.exists(backup_dir):os.makedirs(backup_dir)backup_file_path = os.path.join(backup_dir, os.path.basename(log_file_path) + '.bak')shutil.copy(log_file_path, backup_file_path)print(f"日志文件已成功備份到 '{backup_file_path}'。")except Exception as e:print(f"備份文件時發生錯誤: {e}")if __name__ == '__main__':# 獲取命令行參數# 例如:python log_analyzer.py my_log.txt ERRORif len(sys.argv) != 3:print("用法: python log_analyzer.py <日志文件路徑> <關鍵字>")sys.exit(1)log_file = sys.argv[1]search_keyword = sys.argv[2]# 調用主函數analyze_and_upload(log_file, search_keyword)
2.注
上傳的url可以選用個人網站或者訪問webhook.site,它會生成一個url供測試使用
注釋掉response.json()的原因是,訪問自己的 Webhook URL 時,它會返回一個 HTML 頁面,其中包含了所有發送到該 URL 的請求的列表。這個 HTML 頁面不是 JSON 格式,所以response.json()無法解析它。