【免费下载链接】evlog
Digging through logs is not observability. It's hope — wide events, structured errors, TypeScript-first, every runtime.
evlog 是一款 TypeScript 优先的结构化日志库,主打"宽事件(wide events)"和自解释的结构化错误。它到底比 pino、winston 快多少?一次请求的日志开销是几微秒?每月账单能省多少钱?本文基于仓库自带的 benchmark 套件,把这些数字一次讲清楚——面向刚接触 evlog 的开发者,不需要任何性能测试背景。
📊 先看结论:核心数字一张表
不想看过程的话,这张表就是答案(数据来自 packages/evlog/bench/RESULTS.md):
| 场景 | evlog | pino | winston | consola |
|---|---|---|---|---|
| 简单字符串日志 | 1.83M ops/s(548ns) | 1.09M | 1.20M | 2.79M(最快) |
| 结构化日志(5 字段) | 1.64M ops/s(610ns) | 716K | 431.6K | 1.71M |
| 深层嵌套日志 | 1.55M ops/s(最快) | 464.9K | 164.0K | 1.01M |
| 子级/作用域 logger | 1.70M ops/s(最快) | 845K | 430.0K | 280.4K |
| 宽事件完整生命周期 | 1.58M ops/s(最快) | 205.8K | 111.9K | — |
⚡ 一句话总结:简单打一行字,consola 略快;但只要是带上下文的真实日志场景,evlog 全面领先,宽事件场景下比 pino 快约 7.7 倍、比 winston 快约 14 倍。
🔍 测试是怎么做的?
对比套件的源码在 packages/evlog/bench/comparison/vs-alternatives.bench.ts,用的是 Vitest 的benchAPI,所有库都配置为 JSON 输出到"无操作"目标(不写真实文件)。
官方在 apps/docs/content/7.reference/2.performance.md 中特意说明了各库的"工作量口径"并不完全对等(例如 pino 包含一次/dev/null写入),所以对比数字适合理解量级,而不是当作绝对排名。想自己复现,只需:
cd packages/evlog && pnpm exec vitest bench --run⚡ 真实请求的成本:1 微秒是什么概念
微秒级数字比较抽象,我们看 evlog 最核心的"一次完整请求"场景——从创建中间件 logger、累积上下文,到最终发射(full request lifecycle),源码见 packages/evlog/bench/core/middleware.bench.ts:
| 请求场景 | 吞吐量 | 平均耗时 | p99 耗时 |
|---|---|---|---|
| 无插件、无 drain | 993.7K 次/秒 | 1.01µs | 1.79µs |
| 2 个插件、同步 drain | 621.2K 次/秒 | 1.61µs | 2.46µs |
也就是说:哪怕一个请求里调用了log.set()积累上下文,平均也只多花 1 微秒。拆开看各阶段(数据来自 RESULTS.md):
| 阶段 | 规模 | 平均耗时 |
|---|---|---|
log.set()合并字段 | 3 个字段 | 105ns |
log.set()合并字段 | 50 个字段 | 1.76µs |
log.set()合并字段 | 200 个嵌套字段 | 7.62µs |
emit()最小事件 | — | 519ns |
emit()携带错误 | — | 15.17µs |
💡 可见真正的成本大头是"带错误的事件",而正常请求几乎免费——这正是 evlog 的设计目标:把开销花在值得记录的信号上。
📦 包体积:gzip 后仅 11.8 kB
用同一套 esbuild 打包标准基础配置,gzip 后各库体积对比(RESULTS.md):
| 库 | 版本 | 原始 | Gzip |
|---|---|---|---|
| evlog | 2.29.0 | 31.17 kB | 11.80 kB |
| pino | 10.3.1 | 59.94 kB | 20.05 kB |
| consola | 3.4.2 | 74.73 kB | 22.61 kB |
| winston | 3.19.0 | 144.14 kB | 47.42 kB |
evlog 的 gzip 体积不到 winston 的四分之一。各入口的最小体积也很友好:logger入口 254 B、client(浏览器端)128 B(RESULTS.md)。
💰 从微秒到账单:一次请求到底省多少钱
性能之外的第二个成本是日志账单。官方成本文档 apps/docs/content/7.reference/7.cost.md 用同一个 checkout 请求实测了两种写法:
| 写法 | 事件数 | 字节数 |
|---|---|---|
| pino 逐行打 4 条 | 4 | 736 B |
| evlog 宽事件 1 条 | 1 | 322 B |
| 差异 | 少 75% | 少 56% |
原理很直白:逐行日志会把level、时间戳、method、path、requestId这些"信封字段"重复写 4 遍;宽事件只写一遍。
换算成钱(以 Datadog 牌价为例:$0.10/GB 摄入 + $1.70/百万索引事件,计算逻辑见 apps/docs/app/utils/log-cost.ts):
- 每月 1000 万请求、每请求 4 行日志:月账单约$68.74
- 换成 evlog 宽事件:约$17.32
- 每月省下$51.42,降幅约 75%✅
你的具体数字取决于厂商按 GB 还是按事件计费,仓库的文档站提供了交互式成本计算器,把上面的字节数和费率都内置了,输入自己的流量即可。
🧮 如何正确看待这些数字
官方文档特意提醒了几点,值得新手记住:
- 微基准 ≠ 端到端成本:事件构建的耗时不包含网络投递和后端索引,完整路径请用真实负载压测(2.performance.md);
- 采样是更大的杠杆:宽事件把"每请求 4 行"收敛为"每请求 1 事件",而 头采样 + 尾采样 能让日志量不再跟随流量增长——尾采样规则匹配本身只需 22ns(RESULTS.md);
- pino 有 worker transport:把传输处理放到工作线程,如果你的瓶颈在传输而非构建,现有方案未必需要更换。
小结
| 关注点 | evlog 的表现 |
|---|---|
| 结构化日志速度 | 1.64M ops/s,约为 pino 的 2.3 倍 |
| 完整请求开销 | 平均 1.01µs,p99 1.79µs |
| 包体积 | gzip 11.80 kB,四款中最小 |
| 单请求日志字节 | 322 B vs 736 B,少 56% |
| 月度账单(千万请求量级) | 可省约 75% |
evlog 用"每请求一条宽事件"换来了速度和账单上的双重节省,而它的 benchmark 数据全部开源在 packages/evlog/bench/ 目录中——每个数字都可以自己跑一遍验证。
【免费下载链接】evlog
Digging through logs is not observability. It's hope — wide events, structured errors, TypeScript-first, every runtime.
相关推荐
Chameleon与GraphQL集成:优化多端数据请求
Chameleon与GraphQL集成:优化多端数据请求 引言 在当今多端开发的时代,开发者面临着一个普遍的痛点:如何高效地在不同平台(如Web、小程序、移动端
跨平台前端移动开发小程序构建工具彻底解决Vue数据请求痛点:Axios集成最佳实践指南
彻底解决Vue数据请求痛点:Axios集成最佳实践指南 在Vue开发中,数据请求是连接前端与后端的重要桥梁,而Axios作为基于Promise的HTTP客户端库
网络后端前端autocannon请求数据安全:加密与性能平衡的最佳实践
autocannon请求数据安全:加密与性能平衡的最佳实践 在现代Web应用开发中,数据安全与性能优化往往是一对需要精细平衡的矛盾体。作为基于Node.js的高
性能测试测试开发工具
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考