Python系统资源监控工具开发详解(附完整源码)
本文将详细介绍如何使用 Python 开发一个系统资源实时监控工具,能够定时采集 CPU、内存、磁盘、网络等指标,并将数据记录到格式美观的 Excel 文件中。
当资源使用率异常变化时,还会自动高亮异常数据,方便后续分析。
目录
项目概览
通过定时采集系统的 CPU、内存、磁盘、网络流量等指标,将数据记录到一个带时间戳命名的 Excel 文件中。
如果检测到指标的变化超过设定的阈值,则在 Excel 中高亮显示异常字段,帮助我们快速定位系统负载问题。
技术栈与依赖
- Python 3.x
- 第三方库:
psutil
(采集系统信息)pandas
(操作表格数据)openpyxl
(读写Excel并设置格式)
安装依赖:
pip install psutil pandas openpyxl
功能需求分析
- 每小时记录一次完整数据
- 每3秒检测一次资源变化,变化异常时立即记录并高亮
- 将所有数据记录到日志目录 logs/ 中
- Excel列宽适配、表头加粗、异常项标红
- 文件命名带日期时间,防止覆盖
核心代码讲解
1. 参数配置
INTERVAL = 60 * 60 # 每小时记录一次
CPU_THRESHOLD = 10 # CPU变化阈值10%
MEMORY_THRESHOLD = 5 # 内存变化阈值5%
DISK_THRESHOLD = 10 # 磁盘变化阈值10%
日志文件保存在 logs/ 文件夹,并根据启动时间命名。
2. 数据采集
使用 psutil 获取系统的实时信息,包括 CPU、内存、磁盘、网络流量。
cpu = psutil.cpu_percent(interval=1)
memory = psutil.virtual_memory().percent
net = psutil.net_io_counters()
disk = psutil.disk_usage('/')
这些数据将作为每条记录写入Excel。
3. Excel初始化与格式调整
-
创建新Excel文件
-
写入表头
-
调整列宽
-
表头加粗,居中对齐
from openpyxl.styles import Font, Alignment
header_font = Font(bold=True)
for cell in ws[1]:
cell.font = header_font
cell.alignment = Alignment(wrap_text=True)
4. 写入数据与异常高亮
每次写入一行采集到的数据,如果某些字段异常,则在写入时将该字段字体标红。
red_font = Font(color="FF0000")
ws.cell(row=current_row, column=col_idx).font = red_font
5. 异常检测逻辑
与上一条记录做对比,如果变化幅度超过设定的阈值,则判定为异常。
if abs(current['CPU负载率(%)'] - last['CPU负载率(%)']) > CPU_THRESHOLD:
anomalies.append('CPU负载率(%)')
6. 主程序流程
- 初始化,记录第一次采集数据
- 每3秒采集一次资源
- 检测是否有异常变化,异常则立即记录
- 每隔一小时,无论是否异常,都定时保存一次
- 程序持续运行,直到手动停止
完整源码
import os
import time
from datetime import datetime
import psutil
from openpyxl import Workbook, load_workbook
from openpyxl.styles import Font, Alignment
# ====== 参数配置 ======
INTERVAL = 60 * 60 # 每小时记录一次
CPU_THRESHOLD = 10 # CPU变化阈值10%
MEMORY_THRESHOLD = 5 # 内存变化阈值5%
DISK_THRESHOLD = 10 # 磁盘变化阈值10%
LOG_DIR = "logs"
os.makedirs(LOG_DIR, exist_ok=True)
RUN_TIME = datetime.now().strftime("%Y%m%d %H-%M-%S")
EXCEL_FILE = os.path.join(LOG_DIR, f"system_monitor_{RUN_TIME}.xlsx")
columns = [
'时间',
'CPU负载率(%)',
'内存使用率(%)',
'发送流量(MB)',
'接收流量(MB)',
'磁盘使用率(%)',
'磁盘空闲(GB)'
]
# ====== 初始化Excel文件 ======
wb = Workbook()
ws = wb.active
ws.append(columns)
wb.save(EXCEL_FILE)
# ====== 数据采集 ======
def collect_data():
cpu = psutil.cpu_percent(interval=1)
memory = psutil.virtual_memory().percent
net = psutil.net_io_counters()
disk = psutil.disk_usage('/')
data = {
'时间': datetime.now().strftime("%Y-%m-%d %H:%M:%S"),
'CPU负载率(%)': cpu,
'内存使用率(%)': memory,
'发送流量(MB)': net.bytes_sent / 1024 / 1024,
'接收流量(MB)': net.bytes_recv / 1024 / 1024,
'磁盘使用率(%)': disk.percent,
'磁盘空闲(GB)': disk.free / 1024 / 1024 / 1024,
}
return data
# ====== 调整Excel格式 ======
def adjust_excel_format(file_path):
wb = load_workbook(file_path)
ws = wb.active
header_font = Font(bold=True)
for cell in ws[1]:
cell.font = header_font
cell.alignment = Alignment(wrap_text=True)
col_widths = {'A': 20, 'B': 15, 'C': 15, 'D': 15, 'E': 15, 'F': 15, 'G': 15}
for col_letter, width in col_widths.items():
ws.column_dimensions[col_letter].width = width
wb.save(file_path)
# ====== 写入数据到Excel,异常高亮 ======
def write_data_to_excel(data, highlight_fields=None):
wb = load_workbook(EXCEL_FILE)
ws = wb.active
row = [data[col] for col in columns]
ws.append(row)
if highlight_fields:
current_row = ws.max_row
red_font = Font(color="FF0000")
for field in highlight_fields:
if field in columns:
col_idx = columns.index(field) + 1
ws.cell(row=current_row, column=col_idx).font = red_font
wb.save(EXCEL_FILE)
adjust_excel_format(EXCEL_FILE)
# ====== 检测异常逻辑 ======
def check_anomaly(current, last):
anomalies = []
if last is None:
return anomalies
if abs(current['CPU负载率(%)'] - last['CPU负载率(%)']) > CPU_THRESHOLD:
anomalies.append('CPU负载率(%)')
if abs(current['内存使用率(%)'] - last['内存使用率(%)']) > MEMORY_THRESHOLD:
anomalies.append('内存使用率(%)')
if abs(current['磁盘使用率(%)'] - last['磁盘使用率(%)']) > DISK_THRESHOLD:
anomalies.append('磁盘使用率(%)')
return anomalies
# ====== 主程序 ======
def main():
print("系统监控程序启动!")
last_save_time = time.time()
baseline_data = collect_data()
write_data_to_excel(baseline_data)
print("初始化完成,首次数据记录。")
while True:
current_time = time.time()
temp_data = collect_data()
anomalies = check_anomaly(temp_data, baseline_data)
if anomalies:
print(f"⚠️ 异常变化检测到:{anomalies},记录数据!")
write_data_to_excel(temp_data, highlight_fields=anomalies)
baseline_data = temp_data
if current_time - last_save_time >= INTERVAL:
print("🕐 1小时定时到了,正常记录一次。")
fresh_data = collect_data()
write_data_to_excel(fresh_data)
baseline_data = fresh_data
last_save_time = current_time
time.sleep(3)
if __name__ == "__main__":
main()
总结
Python 强大的第三方库 psutil 和 openpyxl,实现了一个小巧灵活、功能完整的系统资源监控工具。
具备实时监控、异常检测、高亮提示、自动保存Excel日志等功能,且代码结构清晰,易于扩展和二次开发。
可以根据实际需求调整监控间隔、阈值设定,或者增加更多指标的监控,例如GPU使用率、进程占用情况等