Python 腳本,實現以下功能:
- 按日期自動生成日志文件(例如
cpu_mem_20231001.csv
) - 當 CPU 或內存超過閾值時觸發記錄
- 獨立記錄報警事件(保存到
alert.log
) - 支持自定義閾值和監控間隔
腳本代碼
import psutil
import time
import csv
import argparse
from datetime import datetime
import osdef parse_args():"""解析命令行參數"""parser = argparse.ArgumentParser(description='監控 CPU 和內存使用情況')parser.add_argument('--cpu-threshold', type=float, default=80.0,help='CPU 使用率閾值(默認 80%%)')parser.add_argument('--mem-threshold', type=float, default=80.0,help='內存使用率閾值(默認 80%%)')parser.add_argument('--interval', type=int, default=5,help='監控間隔時間(秒,默認 5)')parser.add_argument('--log-dir', type=str, default='logs',help='日志存儲目錄(默認 ./logs)')return parser.parse_args()def get_log_path(log_dir):"""生成按日期命名的日志文件路徑"""os.makedirs(log_dir, exist_ok=True)date_str = datetime.now().strftime("%Y%m%d")return os.path.join(log_dir, f"cpu_mem_{date_str}.csv")def init_log_file(file_path):"""初始化日志文件(寫入表頭)"""if not os.path.exists(file_path):with open(file_path, 'w', newline='') as f:writer = csv.writer(f)writer.writerow(["Timestamp", "CPU%", "Memory%", "Memory_Used_GB", "Memory_Total_GB", "Alert"])def log_alert(message, log_dir):"""記錄報警事件到獨立文件"""alert_path = os.path.join(log_dir, "alert.log")with open(alert_path, 'a') as f:f.write(f"[{datetime.now().strftime('%Y-%m-%d %H:%M:%S')}] {message}\n")def monitor():args = parse_args()current_log_path = Nonewhile True:# 獲取當前日志路徑(按日期)new_log_path = get_log_path(args.log_dir)if new_log_path != current_log_path:current_log_path = new_log_pathinit_log_file(current_log_path)# 獲取系統數據timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")cpu_percent = psutil.cpu_percent(interval=1)mem = psutil.virtual_memory()mem_percent = mem.percentmem_used_gb = round(mem.used / (1024 ** 3), 2)mem_total_gb = round(mem.total / (1024 ** 3), 2)# 判斷是否觸發報警alert = ""if cpu_percent > args.cpu_threshold:alert += f"CPU超過閾值({args.cpu_threshold}%) "if mem_percent > args.mem_threshold:alert += f"內存超過閾值({args.mem_threshold}%)"# 寫入日志with open(current_log_path, 'a', newline='') as f:writer = csv.writer(f)writer.writerow([timestamp, cpu_percent, mem_percent,mem_used_gb, mem_total_gb, alert.strip()])# 記錄獨立報警日志if alert:log_alert(alert, args.log_dir)# 等待下次監控time.sleep(args.interval)if __name__ == '__main__':monitor()
功能說明
1. 按日期生成日志
- 日志文件保存在
./logs
目錄(可通過--log-dir
修改路徑) - 每日生成一個文件,例如
cpu_mem_20231001.csv
- 文件結構示例:
Timestamp,CPU%,Memory%,Memory_Used_GB,Memory_Total_GB,Alert 2023-10-01 14:30:00,15.2,32.1,4.2,13.0, 2023-10-01 14:30:05,89.5,85.3,11.1,13.0,"CPU超過閾值(80.0%) 內存超過閾值(80.0%)"
2. 閾值報警
- 默認閾值:CPU > 80% 或 內存 > 80%(可命令行修改)
- 報警記錄位置:
logs/alert.log
,內容示例:[2023-10-01 14:30:05] CPU超過閾值(80.0%) 內存超過閾值(80.0%)
3. 命令行參數
# 示例:設置 CPU 閾值 70%,內存閾值 90%,間隔 10 秒
python3 monitor.py --cpu-threshold 70 --mem-threshold 90 --interval 10
- 參數列表:
--cpu-threshold
:CPU 報警閾值(百分比)--mem-threshold
:內存報警閾值(百分比)--interval
:監控間隔(秒)--log-dir
:日志目錄路徑
運行方式
1. 安裝依賴
pip install psutil
2. 啟動監控
# 后臺運行(日志保存到 ./logs)
nohup python3 monitor.py > /dev/null 2>&1 &
3. 查看日志
# 實時跟蹤當天日志
tail -f logs/cpu_mem_$(date +%Y%m%d).csv# 查看報警日志
cat logs/alert.log