evlog 的设计支持从两端进行扩展。你可以观察流经管道的内容(不改变管道),接入管道(增强、决定保留哪些内容、响应生命周期事件),或构建你自己的模块(用于不受支持目标的自定义排出器、自定义框架集成)。本节中的每个页面都附带一个 ::prompt 块,你可以将其放入 Cursor / Claude,以便在自己的应用中搭建集成。
心智模型
应用代码
│
│ 发出
▼
┌──────────────────────────────────────────────────────────────────┐
│ evlog 管道 │
│ │
│ 请求生命周期 → 增强 → 尾部采样 → 排出 │
│ │
└──────────────────────────────────────────────────────────────────┘
│ │
│ 观察(不修改) │ 发送
▼ ▼
┌─────────────────────────────────────────┐ ┌─────────────────────┐
│ 流(进程内 + SSE 桥接) │ │ 自定义排出器 │
│ fs 读取器(NDJSON 历史记录) │ │ 排出管道 │
│ 诊断通道(evlog.event) │ │ (批处理 + 扇出) │
│ 消费者方案(开发者工具、仪表板) │ │ │
└─────────────────────────────────────────┘ └─────────────────────┘
三种扩展方式
观察管道(不改变内容)
订阅事件,而不改变发出的内容。流是实时数据源,fs reader 是历史日志,诊断通道允许消费者仅通过通道名称进行订阅,而消费者示例则展示如何将其中任意一种连接到开发工具、仪表板、CLI tail,或 curl + jq。
| 你想要…… | 使用 |
|---|---|
| 订阅实时事件(进程内,或通过 SSE 供浏览器 / CLI 使用) | 流 |
| 从磁盘重放或持续读取历史事件 | FS reader |
构建一个小型消费者面板、开发工具,或连接到 curl + jq 的管道 | 消费者示例 |
| 让消费者无需导入 evlog 即可订阅,或访问 Cloudflare Tail Worker | 诊断通道 |
接入管道
在一个或多个生命周期阶段接入管道。下面四个页面涵盖了完整的扩展面。只有一个关注点时选择其中一个;有多个关注点时选择 definePlugin。
| 你想要…… | 使用 |
|---|---|
| 从一个统一的对象响应生命周期事件(多个 hooks 共享状态) | 插件 |
| 为每个事件自动添加一个派生字段 | 自定义增强器 |
| 事后决定是否保留某个事件(status、duration、自定义逻辑) | 尾部采样 |
在接收端标识你的 evlog 流量(覆盖 User-Agent / X-Evlog-Source) | 身份标头 |
构建你自己的模块
当内置适配器或框架集成无法满足你的需求时,这个工具包允许你以相同的形态和易用性构建自己的方案。
| 你想要…… | 使用 |
|---|---|
| 将事件发送到没有内置适配器的后端(HTTP 或任何其他传输方式) | 自定义 drains |
| 为生产环境将任意 drain 封装为 batch + retry + fanout | Drain 管道 |
| 支持列表中没有的框架,或非 HTTP 运行时 | 自定义框架集成 |
哪些内容在哪里可用
只有 流(进程内总线 + SSE 桥接)是仅限本地的:它存在于单个 Node / Bun / Deno 进程中,无法在无服务器平台(Vercel Functions、Cloudflare Workers、AWS Lambda)上运行。流页面详细解释了这一限制。
其他所有内容,从 FS reader、插件、自定义增强器、尾部采样、身份标头、自定义 drains、Drain 管道 到 自定义框架集成,都可以在 evlog 运行的任何地方运行。