Python 脚本,实现以下功能:
- 按日期自动生成日志文件(例如
cpu_mem_20231001.csv
) - 当 CPU 或内存超过阈值时触发记录
- 独立记录报警事件(保存到
alert.log
) - 支持自定义阈值和监控间隔
脚本代码
import psutil
import time
import csv
import argparse
from datetime import datetime
import os
def 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 = None
while True:
# 获取当前日志路径(按日期)
new_log_path = get_log_path(args.log_dir)
if new_log_path != current_log_path:
current_log_path = new_log_path
init_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.percent
mem_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