当前位置: 首页 > news >正文

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

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

相关文章:

  • MySQL复习(检查本地MySQL是否安装、DataGrip数据库可视化工具使用、增删改查基础语法、唯一索引、SQL简单函数)
  • 单片机自学指南
  • Apifox Helper 自动生成API接口文档
  • 基于“动手学强化学习”的知识点(六):第 19 章 目标导向的强化学习(gym版本 >= 0.26)
  • 强大的CSS变量
  • 华发股份:多元业务协同赋能 财务稳健护航高质量发展
  • 第一章 Python 概述与语法基础
  • IP 协议
  • 71.HarmonyOS NEXT PicturePreviewImage组件深度剖析:从架构设计到核心代码实现
  • 【Tools】Visual Studio Code安装保姆级教程(2025版)
  • PyTorch系列教程:基于LSTM构建情感分析模型
  • 使用curl随机间隔访问URL-使用curl每秒访问一次URL-nginx
  • windows更改系统时间后屏幕开始闪烁
  • 技术-NBIOT
  • nginx中间件部署
  • 996引擎-自定义属性-方法2:setitemcustomabil
  • Altium Designer——CHIP类元器件PCB封装绘制
  • 55年免费用!RevoUninstaller Pro专业版限时领取
  • 来源于雷公藤的CYP450的C-H氧化酶-文献精读116
  • OpenCV多分辨率模板匹配与容错优化实战指南
  • 德国巴斯夫:关税政策加剧全球市场不确定性,间接影响已显现
  • 5月1日,多位省级党委书记调研旅游市场、假期安全等情况
  • “三桶油”一季度净赚966亿元:业绩分化加剧,有人欢喜有人愁
  • “网约摩托”在部分县城上线:起步价五六元,专家建议纳入监管
  • 比黄油年糕热量还高,这个火爆全网的甜品劝你慎吃
  • 上海科创的三种品格