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

news/2025/3/20 1:35:42/

Python 脚本,实现以下功能:

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

脚本代码

python">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


http://www.ppmy.cn/news/1580473.html

相关文章

现代密码学 | 具有数字签名功能的安全方案

1.案例背景 1.1冒用签名触发信任危机,360安全大脑率先截杀解除警报 2020年8月,360安全大脑独家发现冒用数字签名的网络攻击再度活跃,且继此前360安全大脑披露过的Go Daddy、Starfield Secure、赛门铁克、Verisign和DigiCert等国际知名CA证书…

每天五分钟深度学习框架pytorch:基于pytorch搭建循环神经网络RNN

本文重点 我们前面介绍了循环神经网络RNN,主要分析了它的维度信息,其实它的维度信息是最重要的,一旦我们把维度弄清楚了,一起就很简单了,本文我们正式的来学习一下,如何使用pytorch搭建循环神经网络RNN。 RNN的搭建 在pytorch中我们使用nn.RNN()就可以创建出RNN神经网络…

新安装的cursor安装不了插件

我安装的cursor版本0.47.5 直接说解决办法 找到安装路径cursor\resources\app下的product.json 修改https://marketplace.cursorapi.com为https://marketplace.visualstudio.com

【自学笔记】SQL Server基础知识点总览-持续更新

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 SQL Server 基础知识点总览1. 安装与配置2. 数据库与表的操作3. 数据类型4. 基本SQL语句5. 索引与视图6. 存储过程与触发器7. 事务与锁8. 安全性 总结 SQL Server 基…

《我的Python觉醒之路》之转型Python(十三)——控制流

#今天风景不错,明天继续学习 请关注我之前的笔记啊

LeetCode[42] 接雨水

动态规划 left_max[i] height[i]左侧的最高高度right_max[i] height[i]右侧的最高高度height[i]能接多少水&#xff1f;min(left_max[i], right_max[i])-height[i] class Solution { public:int trap(vector<int>& height) {int len height.size();vector<in…

Unity导出WebGL

在Build Settings页面中平台&#xff08;Platform&#xff09;切换到WebGL平台 如何没有安装WebGL扩展插件&#xff0c;点击下载&#xff08;Open Download Page&#xff09; 下载扩展安装文件WebGL-Support-for-Editor-2023.1.0f1c1.exe 下载地址&#xff1a; http://downlo…

Docker 构建 nginx-redis-alpine 项目详解

Docker 构建 nginx-redis-alpine 项目详解 一、课程概述 嘿&#xff0c;朋友们&#xff01;今天咱们要深入探索一个超级实用的项目 ——nginx-redis-alpine&#xff01;这个项目可不简单&#xff0c;它包含了好多重要的知识点&#xff0c;像文件目录结构、核心文件的作用及配…