☰
evlog 性能到底有多快?Benchmark 数据与真实请求成本完全解析
2026/10/11 17:51:38 网站建设 项目流程

【免费下载链接】evlog

Digging through logs is not observability. It's hope — wide events, structured errors, TypeScript-first, every runtime.

项目地址:https://gitcode.com/gh_mirrors/ev/evlog
点击查看免费下载

evlog 是一款 TypeScript 优先的结构化日志库,主打"宽事件(wide events)"和自解释的结构化错误。它到底比 pino、winston 快多少?一次请求的日志开销是几微秒?每月账单能省多少钱?本文基于仓库自带的 benchmark 套件,把这些数字一次讲清楚——面向刚接触 evlog 的开发者,不需要任何性能测试背景。

📊 先看结论:核心数字一张表

不想看过程的话,这张表就是答案(数据来自 packages/evlog/bench/RESULTS.md):

场景evlogpinowinstonconsola
简单字符串日志1.83M ops/s(548ns)1.09M1.20M2.79M(最快)
结构化日志(5 字段)1.64M ops/s(610ns)716K431.6K1.71M
深层嵌套日志1.55M ops/s(最快)464.9K164.0K1.01M
子级/作用域 logger1.70M ops/s(最快)845K430.0K280.4K
宽事件完整生命周期1.58M ops/s(最快)205.8K111.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 耗时
无插件、无 drain993.7K 次/秒1.01µs1.79µs
2 个插件、同步 drain621.2K 次/秒1.61µs2.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
evlog2.29.031.17 kB11.80 kB
pino10.3.159.94 kB20.05 kB
consola3.4.274.73 kB22.61 kB
winston3.19.0144.14 kB47.42 kB

evlog 的 gzip 体积不到 winston 的四分之一。各入口的最小体积也很友好:logger入口 254 B、client(浏览器端)128 B(RESULTS.md)。

💰 从微秒到账单:一次请求到底省多少钱

性能之外的第二个成本是日志账单。官方成本文档 apps/docs/content/7.reference/7.cost.md 用同一个 checkout 请求实测了两种写法:

写法事件数字节数
pino 逐行打 4 条4736 B
evlog 宽事件 1 条1322 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 还是按事件计费,仓库的文档站提供了交互式成本计算器,把上面的字节数和费率都内置了,输入自己的流量即可。

🧮 如何正确看待这些数字

官方文档特意提醒了几点,值得新手记住:

  1. 微基准 ≠ 端到端成本:事件构建的耗时不包含网络投递和后端索引,完整路径请用真实负载压测(2.performance.md);
  2. 采样是更大的杠杆:宽事件把"每请求 4 行"收敛为"每请求 1 事件",而 头采样 + 尾采样 能让日志量不再跟随流量增长——尾采样规则匹配本身只需 22ns(RESULTS.md);
  3. 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.

项目地址:https://gitcode.com/gh_mirrors/ev/evlog
点击查看免费下载

相关推荐

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询