脚本挂机日志监控与Telegram告警:从零搭建异常通知系统

脚本挂机项目最常遇到的问题,不是脚本完全不跑,而是“跑着跑着悄悄挂了”。没有日志监控,一次异常可能造成几小时甚至一整天的损失。本文以 Telegram Bot 为例,介绍如何搭建一套轻量、可用的日志监控与自动告警系统。

一、为什么需要日志监控

脚本挂机通常无人工值守,若失败后不自知,后续任务全部作废。日志是脚本运行状态的直接凭证,监控日志并主动推送异常,是成本最低的保命手段。常见的监控方式有三种:人工定时查看、轮询日志关键字、守护进程自动重启。本文重点讲第二种,并延伸到异常通知。

二、准备工作

你需要准备:

  • 一个 Telegram 账号(用于接收通知)
  • 一台能联网的电脑或服务器(Windows 或 Linux 均可)
  • 脚本输出的日志文件(例如 run.log)

三、创建 Telegram Bot

在 Telegram 中搜索 @BotFather,发送 /newbot,按提示设置名称和用户名,完成后会得到一个 API Token。记住它,这是发送消息的凭证。接着获取你的 chat_id:把 Bot 拉进一个群或直接向 Bot 发一条消息,然后访问 https://api.telegram.org/bot<TOKEN>/getUpdates,在返回的 JSON 中找到 chat 对象里的 id。

四、编写监控脚本

Windows 版(PowerShell)

  1. Get-Content 读取日志最后若干行(例如 -Tail 50)。
  2. Select-String 匹配 “ERROR” 或你自定义的关键字。
  3. 若匹配成功,用 Invoke-RestMethod 调用 Telegram API 发送文本消息。

示例关键片段:

Get-Content run.log -Tail 50 | Select-String -Pattern ‘ERROR’ | ForEach-Object { Invoke-RestMethod -Uri “https://api.telegram.org/bot$token/sendMessage” -Method Post -Body @{chat_id=$chatId; text=”脚本异常:$_”} }

Linux 版(Bash)

  1. 使用 tail 命令读取日志末尾。
  2. 使用 grep 过滤关键错误。
  3. 使用 curl 发送 POST 请求到 Telegram。

示例关键片段:

tail -50 run.log | grep ‘ERROR’ && curl -s -X POST “https://api.telegram.org/bot$TOKEN/sendMessage” -d chat_id=$CHAT_ID -d text=”脚本异常:$(tail -50 run.log | grep ‘ERROR’)”

五、设置定时任务

Windows:任务计划程序

在“任务计划程序”中创建基本任务,触发器选择“每天”,时间设为任意,操作选择“启动程序”,程序填 powershell.exe,参数填 -File “C:pathtomonitor.ps1″。然后打开任务属性,在“触发器”选项卡中编辑,改为“重复任务间隔 5 分钟”,持续时间“无限期”。

Linux:crontab

执行 crontab -e,加入一行:

*/5 * * * * /path/to/monitor.sh

六、风险提示

  • API Token 一旦泄露,别人可以冒充你的 Bot 发消息,务必妥善保存,不要提交到公开仓库。
  • 告警通知可能因网络延迟或代理导致失败,建议在脚本中增加重试逻辑或超时设置。
  • 误报会对可持续性造成影响,建议先在小流量环境测试,调整关键字匹配规则。
  • 日志文件会持续增长,别忘了定期清理或按大小轮转,例如使用 logrotate。

七、检查清单

  • 是否已经在 Telegram 测试过 Bot 发送消息?
  • 是否将脚本中的 Token 和 Chat ID 替换为真实值?
  • 是否设置定时任务,且触发时间合理?
  • 测试异常时能否准确收到通知?
  • 是否加入重复告警抑制逻辑,避免每轮都发?
  • 是否对日志文件做了轮转策略?

本文提供的方案用简单命令实现了“挂机状态可知”。你可以根据实际情况扩展多关键字、告警级别、静默时间等功能,但核心是让异常能被及时看到。

© 版权声明
THE END
喜欢就支持一下吧
点赞6 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片快捷回复

    暂无评论内容