Skip to main content
实战日:Day 13 是 Python 阶段的期末考试。我们将融合前 5 天的所有知识点(文件处理、正则、subprocess、PyMySQL),开发一个 端到端的自动化监控与告警工具。今天不只是写代码,而是要彻底理解 “如何将多个知识点整合成完整项目”“如何设计一个可扩展的监控系统” 以及 “如何让脚本在生产环境中稳定运行”

实战目标 | Project Goal

开发工具 13_ops_toolbox.py,实现以下”一条龙”服务:

1. 日志采集

读取 Nginx/App 日志文件,利用正则表达式提取关键错误信息 (Error/Exception)。

2. 系统快照

调用 subprocess 获取当前 CPU/内存负载,作为环境上下文。

3. 数据持久化

将提取的错误信息 + 系统负载写入 MySQL 数据库进行归档。

4. 异常告警

如果错误数超过阈值,触发(模拟)钉钉/Slack 告警

代码任务 (120 mins)

1

环境准备

确保所有依赖已安装:
创建模拟日志文件 app_error.log
2

数据库建表

在使用脚本前,先创建数据库表:
3

完整的 Python 代码实现

这个脚本融合了前 5 天的所有知识点,可以作为你未来的”万能脚手架”。
代码结构说明
  • 配置区:集中管理所有配置,便于修改
  • 数据库管理:使用上下文管理器确保连接正确关闭
  • 系统监控:使用 subprocess 获取系统信息
  • 日志分析:使用正则表达式提取错误信息
  • 数据存储:使用参数化查询防止 SQL 注入
  • 告警机制:根据阈值判断是否需要告警
运行脚本
验证步骤
  1. 确保 MySQL 服务正在运行
  2. 确保 app_error.log 文件存在
  3. 运行脚本,检查输出是否正确
  4. 在数据库中验证数据是否插入成功:
  5. 测试告警功能:修改日志文件增加错误数量,观察是否触发告警
常见错误
  • FileNotFoundError: [Errno 2] No such file or directory: 'app_error.log' - 日志文件不存在,需要先创建
  • pymysql.err.OperationalError: (2003, "Can't connect to MySQL server") - 数据库服务未启动
  • subprocess.CalledProcessError - 系统命令执行失败,检查命令是否存在

拓展任务 (30 mins)

挑战 1:定时执行

任务:研究如何使用 Linux 的 crontab 让脚本定时执行。步骤
  1. 编辑 crontab:crontab -e
  2. 添加定时任务:* * * * * /path/to/python3 /path/to/13_ops_toolbox.py >> /tmp/ops.log 2>&1
  3. 验证:等待 1 分钟后检查日志文件
提示:不要在 Python 里写 while True + sleep,使用 crontab 更可靠。

挑战 2:真实告警

任务:配置真实的钉钉或 Slack Webhook,实现真正的告警推送。提示
  • 钉钉:创建自定义机器人,获取 Webhook URL
  • Slack:创建 Incoming Webhook,获取 URL
  • 使用 requests 库发送 POST 请求

今日产出物

  • 13_ops_toolbox.py - 完整的运维自动化工具箱
  • app_error.log - 模拟日志文件
  • monitor_logs 表 - 数据库监控日志表

参考代码

查看参考代码

在 GitHub 查看完整的示例代码

在线运行

使用在线编辑器测试代码

实际应用场景

监控工具在生产环境中的应用

  • 日志监控:实时监控应用日志,及时发现错误
  • 系统监控:定期检查系统资源使用情况
  • 告警通知:异常情况及时通知运维人员
  • 数据归档:将监控数据存入数据库,便于后续分析
  • 自动化运维:减少人工巡检,提高效率

项目设计要点

  • 模块化设计:将功能拆分成独立函数,便于测试和维护
  • 配置集中管理:所有配置集中在顶部,便于修改
  • 错误处理:完善的异常处理,确保脚本稳定运行
  • 可扩展性:预留扩展接口,便于后续添加功能
  • 文档完善:代码注释清晰,便于团队协作
与 Day 14 的关联:今天完成的综合项目,明天会进行复盘和总结,回顾第二周学到的所有知识点,并为第三周的 FastAPI 学习做准备。

上一天: MySQL操作

Day 12 | Python 操作 MySQL

下一天: 第二阶段复盘

Day 14 | 第二阶段复盘