python脚本实现服务器内存和cpu使用监控,并记录日志,可以设置阈值和采样频率

发布于:2025-03-16 ⋅ 阅读:(15) ⋅ 点赞:(0)

Python 脚本,实现以下功能:

  1. 按日期自动生成日志文件(例如 cpu_mem_20231001.csv
  2. 当 CPU 或内存超过阈值时触发记录
  3. 独立记录报警事件(保存到 alert.log
  4. 支持自定义阈值和监控间隔

脚本代码

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


网站公告

今日签到

点亮在社区的每一天
去签到