Heroku 日志实战:Logplex 体系、heroku logs 与日志外送
Heroku 日志中文实战:Logplex 日志总线工作原理、heroku logs 命令(--tail/--source/--dyno)、日志保留限制、Log Drains 外送机制、结构化日志最佳实践,以及如何用观测云接收并告警 Heroku 应用日志。
Heroku 的日志体系围绕 Logplex 构建:一个面向流的日志总线,汇总应用 dyno、路由器、平台的全部日志。理解 Logplex 的"只流不存"特性,是管好 Heroku 日志的关键。本文讲解日志查看、外送与结构化最佳实践,并给出观测云平台的落地方案。
核心要点速览
- Logplex 是日志总线而非存储:默认只保留最近约 1500 行/一周——长期存储必须外送(Log Drain)。
- 日志来源分三类:
app(应用输出)、router(HTTP 请求路由)、heroku(平台事件:部署/重启/崩溃)。 - heroku logs --tail 是排障起点,
--source、--dyno、--num精细过滤。 - 生产落地:Log Drain 推送到观测云 HTTP 日志接收端,检索告警一站式。
1. Logplex 工作原理
Heroku 把每个 dyno 的 stdout/stderr、路由器请求日志、平台事件汇聚到 Logplex 流中:
2026-08-25T14:55:22.123+00:00 heroku[router]: at=info method=GET path="/api/orders" host=example.com request_id=7f3a status=200 ...
2026-08-25T14:55:22.456+00:00 app[web.1]: INFO 订单创建成功 {"order_id":1024}
2026-08-25T14:55:30.000+00:00 heroku[web.1]: Restarting
每条带时间戳、来源(source)、进程(dyno)三元组。Logplex 默认只缓存最近约 1500 行——它是传输层,不是存储层。要长期保留与检索,必须配置 Log Drain 外送。
2. heroku logs 命令
heroku logs --tail # 实时跟踪
heroku logs --num 500 # 拉取最近 500 行
heroku logs --source router # 只看路由日志(HTTP 请求)
heroku logs --source app # 只看应用输出
heroku logs --dyno web.1 # 只看某个 dyno
heroku logs --source app --dyno worker.1 --tail
排障组合拳:--source router 看请求面(状态码、耗时),--source app 看业务面,平台事件(崩溃 H10、内存超限 R14)看 heroku source。
3. 五条 Heroku 日志最佳实践
- 写 stdout/stderr:Heroku 只收集标准输出流——写文件等于丢日志;
- 结构化输出:JSON 或 logfmt,让平台自动解析字段;
- 关键事件带上下文:用户操作日志带 user_id、request_id,而不是一行裸消息;
- 正确分级:INFO 记业务事件、ERROR 记失败——router 日志里的 H/R 系列错误码(H12 超时、R14 内存超限)要单独关注;
- 敏感数据不入日志:密码、卡号、Token 立法禁止。
4. Log Drains:日志外送
# 添加 HTTP(S) drain:日志实时推送到指定端点
heroku drains:add https://<接收端点> -a <应用名>
heroku drains # 查看已配置 drain
Drain 支持 HTTP(S) 与 syslog 两种协议。Heroku 的日志以 syslog 帧格式(或 HTTPS 批次)发出,接收端解析后入库。
观测云落地:Heroku 日志接入
- 接收:观测云支持标准日志推送接口,将 Log Drain 端点指向观测云 HTTP 日志接收地址(DataKit 开启 HTTP 日志输入插件亦可作为中继),
source: heroku、service按应用区分。 - 解析:Pipeline 解析 router 日志的键值对(method/path/status/request_id)与应用 JSON 日志,映射标准
status/time。 - 检索告警:日志查看器按 service/status/dyno 过滤;监控器对 H12/R14 等平台错误码、应用 error 日志设阈值,告警策略路由钉钉/企业微信/飞书。
- 关联:request_id 贯穿 router 与应用日志,排障时按 request_id 过滤出完整请求链路。
- 成本控制:router 访问日志量大走低频索引,error 日志标准索引长保留,历史数据归档对象存储。
常见问题(FAQ)
Heroku 日志默认保留多久?
Logplex 只缓存最近约 1500 行(大致相当于一周的滚动窗口,先到先出)。任何"昨天出了什么问题"级别的事后排查都必须依赖 Log Drain 外送到日志平台。
router 日志里的 H12、R14 是什么?
Heroku 平台错误码:H12 = 请求超时(30 秒未响应),R14 = 内存超限(dyno 开始使用 swap)。H 系列是路由/请求问题,R 系列是运行时资源问题——都值得在观测云里配监控器告警。
多个 Heroku 应用的日志能统一吗?
每个应用各自配置 Drain 指向观测云,service 字段按应用区分;平台侧一个工作空间统一检索、告警、出图。
Log Drain 推不出去会怎样?
Heroku 会丢弃无法送达的日志(Logplex 无持久缓冲)。选接收端时考虑可用性;DataKit 中继可用本地磁盘缓冲消化短时故障。
系列阅读
- 上一篇:Docker Compose 日志指南
- 下一篇:Vercel 日志实战
- 相关阅读:什么是日志聚合 | 日志最佳实践总论