宝塔日志关键词监控:抓取报错日志触发钉钉告警
为什么要对宝塔日志做关键词监控
使用宝塔面板管理站点的运维人员,通常会把网站日志放在 /www/wwwlogs 目录下。PHP 报错、数据库连接失败、502/504 网关错误等信息都会写入这些日志文件。问题在于,日志本身不会主动通知人:如果没有人工翻看,一个反复出现的 Fatal error 可能要等到业务方反馈才被发现。
把「日志关键词匹配」和「钉钉机器人」串起来,就可以用较低的成本实现一套报错告警链路:脚本定时读取日志,命中预设关键词时推送消息到钉钉群,把被动排查变成主动发现。
整体思路
整套方案不依赖复杂组件,核心只有三步:
- 采集:由 Shell 或 Python 脚本定时读取指定日志文件。
- 匹配:按关键词列表逐行判断,命中即记录。
- 通知:通过钉钉自定义机器人的 Webhook 发送消息。
触发时机交给宝塔面板自带的「计划任务」功能即可,无需额外部署定时服务。
第一步:确定要监控的日志与关键词
日志来源
- 站点访问日志与错误日志:一般位于站点对应的 *.log 与 *.error.log 文件。
- PHP 错误日志:可在宝塔的 PHP 设置中确认 error_log 的落盘路径。
- MySQL、Nginx 等服务日志:按实际部署位置确认,注意脚本需要有读取权限。
关键词建议分层
关键词过宽会产生大量噪音,过窄则容易漏报。可以从实际报错中提炼,并按严重程度分组:
- 高优先级:Fatal error、SQLSTATE、Out of memory、Disk full、Too many connections。
- 中优先级:502、504、upstream timed out、connection refused。
- 提示级:Warning、Deprecated(是否开启,取决于站点对日志噪音的容忍度)。
第二步:配置钉钉自定义机器人
- 在目标钉钉群中进入「群设置」→「智能群助手」→「添加机器人」→ 选择「自定义」。设定机器人名称后,获取 Webhook 地址。
- 安全设置建议至少启用一项:加签(推荐)、自定义关键词或 IP 白名单。使用加签时,脚本需按钉钉文档要求计算签名并附加时间戳参数。
- 若选择「自定义关键词」方式,消息内容中必须包含设定词,例如把「告警」二字写进消息标题。
- Webhook 地址与加签密钥属于敏感信息,建议存放在脚本目录之外的受限文件中,并设置严格的读取权限。
第三步:编写关键词匹配与推送脚本
脚本的核心逻辑可以归纳为以下几点:
- 增量读取:记录每个日志文件上次读取到的位置(偏移量或最后一行时间戳),每次只处理新增内容,避免重复告警。
- 关键词匹配:将关键词维护为数组,逐行判断,命中后连同前后若干行上下文一起收集,便于定位问题。
- 消息组装:拼出包含时间、主机、日志文件路径、命中关键词和上下文的消息体,以 JSON 格式提交给 Webhook。
- 状态回写:推送成功后更新读取位置记录;推送失败则保留现场,等待下个周期重试。
- 自身日志:脚本运行结果单独写入一个监控日志文件,方便排查脚本本身是否正常执行。
推送环节用系统自带的 curl 即可完成,无需安装额外依赖。
第四步:挂载到宝塔计划任务
在宝塔面板左侧菜单进入「计划任务」,新建一个「Shell 脚本」类型的任务:
- 任务名称填一个便于识别的名字,例如「日志关键词告警」。
- 执行周期按业务对故障响应速度的要求设置,常见做法是每分钟或每五分钟一次。
- 脚本内容填写解释器路径加脚本文件路径,并把标准输出重定向到监控日志中。
- 保存后建议先手动「执行」一次,确认能否正常读取日志并收到钉钉消息。
常见问题与优化建议
告警风暴
一个持续报错的程序可能在短时间内产生成百上千行相同日志。建议对命中内容做聚合:按「错误指纹 + 时间窗口」合并,同一指纹在设定时间窗口内只推送一次,或设置静默期后再恢复推送。
日志切割导致漏读
站点日志通常会按天切割或归档,仅依赖文件大小或偏移量在文件被截断、重建后会失效。建议同时比对文件的 inode 或创建时间,发现文件发生变化就重置读取位置,避免读到旧数据或漏掉新文件。
权限与安全
运行脚本的用户需要对日志文件有读权限;若使用 root 运行,请注意脚本内容不可被其他用户修改。Webhook 地址与密钥不要硬编码在网站目录下的文件中,也不要输出到公开可访问的页面。
误报与漏报的平衡
关键词列表建议定期回顾:把频繁出现但无实际影响的条目降级或移出,把真实造成业务中断但未覆盖的条目补充进来。告警的价值取决于信噪比,而不是数量。
结语
日志关键词监控并不复杂,它的意义在于把「日志里写了什么」变成「有人第一时间知道」。先在少量站点上跑通链路,确认关键词与告警频率可接受后,再逐步推广到更多站点和服务,是比较稳妥的落地节奏。