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