题目1:系统监控报警与修复(在windows系统下即可) (1)每隔10秒钟监控一次Server的信息,包括CPU、内存的使用情况,并记录在mysql数据库中。 (2)建立相应的日志,用于记录上述每一个监控对象的状况。 (3)日志的格式如下: 级别-------日期时间--------监控项-------监控项数值---- 例如:DEBUG-----2025/05/21 10:30------CPU负载------10% (4)记录日志的原则如下: 数值区间 级别 0<CPU<30、0<内存<30 DEBUG 30<CPU<50、30<内存<50 INFO 50<CPU<80、50<内存<80 WARNING 80<CPU<99、80<内存<99 ERROR CPU>99、 内存>99 CRITAL (5)一旦系统达到了CRITAL级别,则立即发送一封告警邮件至自己的邮箱。邮件的正文内容为当前系统监控的级别以及负载大小,附件为日志文件。 (6)如果连续监控4次服务器某监控项均为CRITAL级别,强制重启服务器(windows系统中重启的命令为:shutdown /r )
时间: 2025-08-08 19:19:42 浏览: 4
<think>好的,我现在需要帮助用户解决在Windows系统下实现系统监控的问题。用户的具体需求包括周期性记录CPU和内存使用情况,存储到MySQL数据库,生成不同级别的日志,发送告警邮件,以及在连续四次CRITAL级别时重启服务器。首先,我要分解这些需求,逐步思考如何实现每个部分。首先,周期性监控。用户要求每10秒一次,这可能需要用到Python的定时任务模块,比如sched或APScheduler。或者使用循环加time.sleep(10),但需要考虑准确性。
接下来是获取CPU和内存的使用情况。在Windows下,可以使用psutil库,这个库跨平台,能方便地获取系统信息。例如,psutil.cpu_percent()和psutil.virtual_memory().percent可以分别获取CPU和内存的百分比。存储到MySQL数据库,需要用到Python的MySQL驱动,比如mysql-connector-python或PyMySQL。需要设计数据库表结构,可能包括时间戳、CPU使用率、内存使用率、日志级别等字段。需要确保数据库连接稳定,处理可能的异常。日志生成部分,用户要求不同的数值区间对应不同的日志级别。比如,DEBUG(<30%)、INFO(30-50%)、WARNING(50-70%)、ERROR(70-90%)、CRITAL(>=90%)。这需要编写一个函数,根据数值返回对应的级别,并使用logging模块来记录不同级别的日志,同时可能需要配置日志处理器,将不同级别输出到不同文件或控制台。邮件告警部分,当达到CRITAL级别时发送邮件。这需要使用smtplib库,配置SMTP服务器(如Gmail或企业邮箱),处理身份验证,编写邮件内容,并在检测到CRITAL时触发发送。需要注意邮箱的安全设置,比如开启应用专用密码,防止被拦截。
连续四次CRITAL重启服务器的条件。这里需要维护一个计数器,每次检测到CRITAL时增加,否则重置。当计数器达到4时,执行重启命令。在Windows下重启可以使用os.system("shutdown/r/t1"),但需要管理员权限。因此,程序可能需要以管理员身份运行,否则会失败。同时,需要考虑在重启前保存状态或日志,避免数据丢失。
整合各部分时,需要注意代码的结构,可能分为监控模块、数据库模块、日志模块、邮件模块和主循环。同时处理并发或阻塞问题,比如邮件发送可能耗时,应该放在单独的线程中,避免影响监控周期。异常处理也很重要,比如数据库连接失败、邮件发送失败、权限不足等,需要有重试机制或记录错误日志。此外,程序需要能够长时间运行,可能需要作为Windows服务运行,或者使用任务计划程序定期启动。
测试方面,需要模拟高CPU和内存使用情况,验证各个级别的日志是否正确生成,邮件是否发送,以及计数器是否准确触发重启。同时,测试数据库写入是否正常,数据是否按预期存储。
最后,考虑用户可能的环境配置,比如Python版本、库的安装、MySQL的配置,以及Windows的权限设置。需要提供详细的步骤说明,确保用户能顺利部署和运行程序。</think>### 实现步骤详解
#### 一、基础环境配置
1. 安装Python 3.10+并配置环境变量
2. 安装依赖库:
```cmd
pip install psutil mysql-connector-python python-dotemail
```
#### 二、数据库设计
创建监控数据表(示例):
```sql
CREATE TABLE system_monitor (
id INT AUTO_INCREMENT PRIMARY KEY,
timestamp DATETIME DEFAULT CURRENT_TIMESTAMP,
cpu_usage FLOAT NOT NULL,
mem_usage FLOAT NOT NULL,
log_level VARCHAR(10) NOT NULL
);
```
#### 三、核心代码实现
```python
import psutil
import mysql.connector
import logging
import smtplib
from email.mime.text import MIMEText
import time
# 配置参数
class Config:
DB_CONFIG = {
'host': 'localhost',
'user': 'monitor_user',
'password': 'Monitor@123',
'database': 'system_monitor'
}
SMTP_CONFIG = {
'server': 'smtp.office365.com',
'port': 587,
'user': '[email protected]',
'password': 'SecurePwd123'
}
THRESHOLDS = {
'DEBUG': 30,
'INFO': 50,
'WARNING': 70,
'ERROR': 90,
'CRITICAL': 95
}
# 日志配置
logging.basicConfig(
level=logging.DEBUG,
format='%(asctime)s - %(levelname)s - %(message)s',
handlers=[
logging.FileHandler('system_monitor.log'),
logging.StreamHandler()
]
)
# 邮件告警函数
def send_alert(subject, message):
msg = MIMEText(message)
msg['Subject'] = subject
msg['From'] = Config.SMTP_CONFIG['user']
msg['To'] = '[email protected]'
try:
server = smtplib.SMTP(Config.SMTP_CONFIG['server'], Config.SMTP_CONFIG['port'])
server.starttls()
server.login(Config.SMTP_CONFIG['user'], Config.SMTP_CONFIG['password'])
server.sendmail(Config.SMTP_CONFIG['user'], ['[email protected]'], msg.as_string())
server.quit()
except Exception as e:
logging.error(f"邮件发送失败: {str(e)}")
# 数据库操作类
class DBOperator:
def __init__(self):
self.conn = mysql.connector.connect(**Config.DB_CONFIG)
self.critical_counter = 0 # 连续CRITICAL计数器
def store_data(self, cpu, mem, level):
try:
cursor = self.conn.cursor()
query = "INSERT INTO system_monitor (cpu_usage, mem_usage, log_level) VALUES (%s, %s, %s)"
cursor.execute(query, (cpu, mem, level))
self.conn.commit()
# 处理连续CRITICAL逻辑
if level == 'CRITICAL':
self.critical_counter +=1
if self.critical_counter >=4:
os.system("shutdown /r /t 1") # 需要管理员权限
else:
self.critical_counter = 0
except Exception as e:
logging.error(f"数据库操作失败: {str(e)}")
self.conn.rollback()
# 监控主逻辑
def monitor_loop():
db = DBOperator()
while True:
try:
cpu = psutil.cpu_percent(interval=1)
mem = psutil.virtual_memory().percent
# 确定日志级别
if cpu >= Config.THRESHOLDS['CRITICAL'] or mem >= Config.THRESHOLDS['CRITICAL']:
level = 'CRITICAL'
elif cpu >= Config.THRESHOLDS['ERROR'] or mem >= Config.THRESHOLDS['ERROR']:
level = 'ERROR'
elif cpu >= Config.THRESHOLDS['WARNING'] or mem >= Config.THRESHOLDS['WARNING']:
level = 'WARNING'
elif cpu >= Config.THRESHOLDS['INFO'] or mem >= Config.THRESHOLDS['INFO']:
level = 'INFO'
else:
level = 'DEBUG'
# 记录日志和存储数据
logging.log(getattr(logging, level),
f"CPU使用率: {cpu}%, 内存使用率: {mem}%")
db.store_data(cpu, mem, level)
# 发送CRITICAL告警
if level == 'CRITICAL':
send_alert("系统紧急告警",
f"当前CPU使用率: {cpu}%, 内存使用率: {mem}%")
time.sleep(10)
except KeyboardInterrupt:
break
except Exception as e:
logging.error(f"监控异常: {str(e)}")
time.sleep(30)
if __name__ == "__main__":
monitor_loop()
```
#### 四、关键优化点
1. 使用连接池提升数据库操作性能[^1]
2. 添加指数退避机制处理网络故障
3. 采用异步方式处理邮件发送
4. 增加监控数据清理策略
#### 五、部署注意事项
1. 需要以管理员身份运行程序(UAC提权)
2. 建议注册为Windows服务
3. 需要配置MySQL白名单访问
4. 邮件服务需开启TLS加密传输
阅读全文