报错是这么冒出来的。巡检脚本每天把结果追加到一个 txt,跑了三个月文件两百多兆,想知道某条 URL 是哪天开始 404 的,只能手工翻。

真正麻烦的地方在于,几个原因的现象几乎一样。结果只存文本,没有结构化字段。另一种情况是没有按 URL 建唯一索引,历史状态无法关联。

另外,报告没有汇总,异常靠人眼扫。

动手时先把结果落进数据库表

CREATE TABLE url_check (url VARCHAR(255) PRIMARY KEY, status INT, checked_at DATETIME);

每次巡检做覆盖写并记录变更

INSERT INTO url_check VALUES ('https://www.example.com/p/1', 404, NOW()) ON DUPLICATE KEY UPDATE status = VALUES(status), checked_at = VALUES(checked_at);

接着查出状态发生变化的 URL

SELECT url, status FROM url_check WHERE status <> 200 ORDER BY checked_at DESC LIMIT 20;

末了把异常推送到告警通道

curl -s -X POST https://alert.example.com/hook -d '{"text":"巡检异常 12 条"}'

这类改动我都写进变更记录,过两周再出问题时能对上号。

恢复的判定其实很直接。改完后能直接查出首次出现 404 的日期,断链修复周期从平均两周缩到三天。

这里还有个坑。巡检的价值在对比不在采集,没有历史基线,跑得再勤也只是一堆当天快照。线上能稳定复现的问题都不算难,难的是只在大流量下才出现的那种。

作者 9823189