资讯动态

搭建自己的微信通知节点:用 API 把服务器报错和报警消息实时推送到微信

发布时间:2026/10/23 4:21:05 来源:尧图企业网站定制
服务器报警推到微信说起来简单——抓日志、匹配错误、发消息。实际做起来会遇到三个问题告警风暴1 分钟来 50 条一模一样的错误、分级混乱Info 级的调试日志也推到微信、报警淹没半夜一堆错误混在一起看不清重点。这篇讲怎么做一个能长期用的通知节点。一、报警聚合相同错误只推一次1 分钟内可能刷出几十条一模一样的报错日志——同一个 OOM、同一个数据库连接池耗尽每条都推到微信只会让你麻木。做法按错误的指纹聚合短时间窗口内比如 5 分钟同指纹只推一次附带聚合数量。指纹可以取错误堆栈的前几行哈希或者错误消息的核心部分去掉变量比如把具体 IP 换成ip后取哈希。二、分级推送不同级别不同通道不是所有错误都值得在微信里提醒。建议分三级P0紧急——服务挂了、数据丢失直接微信推送可以考虑电话兜底。P1警告——数据库连接慢、磁盘快满微信推送不打电话。P2提示——常规运行状态、调试信息不推微信只记在日志里。分级逻辑要做成可配置的哪些错误关键字算 P0、哪些算 P1改配置就能调不改代码。三、格式友好一眼能看出啥问题推送的消息要能一眼看懂什么服务、什么错误、什么时候、简单的堆栈摘要。别把几十行堆栈直接贴过来取前 5-10 行核心部分就行。消息末尾附一个短的排查链接或 runbook 指引看到错误不用再去搜解决办法。四、实时推送 vs 定时汇总P0 类要实时推出了问题马上知道。P1 类可以定时汇总——比如每 10 分钟把累计的 P1 报警聚合成一条推送避免刷爆微信。通知节点对照环节做什么关键点常见坑聚合同指纹合并5 分钟窗口告警风暴分级P0/P1/P2可配置规则Info 也推微信格式化服务错误时间摘要取前 10 行堆栈长堆栈刷屏推送实时 vs 定时分级决定频率全实时被淹没通知节点实现import time, hashlib class AlertNotifier: def __init__(self, api, store, rules): self.api api self.store store self.rules rules # 关键字 - 级别 self.windows {} # 指纹 - (count, first_ts, level) def fingerprint(self, message): # 错误消息归一后取哈希去变量、取核心 normalized self._normalize(message) return hashlib.md5(normalized.encode()).hexdigest() def _normalize(self, msg): # 把具体 IP、数字、时间戳替换成占位符 import re msg re.sub(r\b\d\.\d\.\d\.\d\b, ip, msg) msg re.sub(r\b\d\b, n, msg) lines msg.strip().split(\n)[:5] return \n.join(lines) def classify(self, message): for level, keywords in self.rules.items(): if any(kw in message for kw in keywords): return level return P2 # 默认 P2 def on_alert(self, message, service): level self.classify(message) if level P2: self.store.log(message) # P2 不推微信只记日志 return fp self.fingerprint(message) self.store.increment(fp, level) # 聚合计数器 if self.store.should_push(fp, level): count self.store.count(fp, level) formatted self.format(service, message, level, count) self.api.post(/send, { wxid: self.notify_wxid, content: formatted[:500], }, timeout15) time.sleep(3) def format(self, service, msg, level, count): head f[{level}] {service} {time.strftime(%H:%M)} body \n.join(msg.strip().split(\n)[:8]) tail f\n近 5 分钟同错误累计 {count} 次 return head \n body tail落地建议相同错误按指纹聚合5 分钟窗口内只推一次附聚合数量避免告警风暴。分级推送——P0 实时、P1 定时汇总、P2 只记日志分级规则做成配置项不改代码。推送消息格式化——服务名、错误级别、时间、堆栈摘要取前 5-10 行末尾附排查指引。微信侧的消息接口由Eyun这类个人微信API平台 提供通知聚合与分级逻辑在自建服务实现具体字段以平台开发文档为准。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑