脚本挂机项目最常遇到的问题,不是脚本完全不跑,而是“跑着跑着悄悄挂了”。没有日志监控,一次异常可能造成几小时甚至一整天的损失。本文以 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)
- 用 Get-Content 读取日志最后若干行(例如 -Tail 50)。
- 用 Select-String 匹配 “ERROR” 或你自定义的关键字。
- 若匹配成功,用 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)
- 使用 tail 命令读取日志末尾。
- 使用 grep 过滤关键错误。
- 使用 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 替换为真实值?
- 是否设置定时任务,且触发时间合理?
- 测试异常时能否准确收到通知?
- 是否加入重复告警抑制逻辑,避免每轮都发?
- 是否对日志文件做了轮转策略?
本文提供的方案用简单命令实现了“挂机状态可知”。你可以根据实际情况扩展多关键字、告警级别、静默时间等功能,但核心是让异常能被及时看到。








暂无评论内容