Skip to content

LoggerJS 与其他 JavaScript Logger 对比

本页比较当前 LoggerJS workspace 与常见 JavaScript logging libraries。它基于当前仓库状态,而不是目标路线图。

范围

除非表格单元格明确写着 “ecosystem”,否则比较使用 first-party 行为。来源检查时间为 2026-06-12:

下方 benchmark 数字只适用于 基准 中的场景。它们不声称在所有 sinks、runtimes、payload shapes 或第三方 transports 上都有普遍优势。

简短结论

当日志问题横跨浏览器和服务器采集时,LoggerJS 最合适:automatic integrations、structured middleware、可靠 transport delivery、浏览器离线持久化、每个 destination 自选 codec,以及从同一心智模型投递到 vendor/DB/OTLP。它最可防御的细分场景是 vendor-neutral, self-hosted delivery:日志发送到你自己拥有的目的地(HTTP、files、your DB、Loki/Elasticsearch、OTLP),来自一个能在 strict CSP、edge/Workers、offline 场景中运行的 zero-dependency core。对于这些场景,纯 Node logger 或 managed APM SaaS 往往不够贴合。

如果主要需求是最小、Node-first、生态成熟的 JSON logger,Pino 仍是成熟默认选择。在当前 M1 Max 参考 benchmark 上,LoggerJS 等价 lean/prepared paths 更快,但排序依赖 CPU/Node-V8。Winston 仍是成熟、灵活的 Node transport 和 format ecosystem。LogTape 是最接近的架构同行,适合 library-first usage 和 multi-runtime categories。Bunyan 是稳定的 legacy Node JSON logger。

一览

图例:✅ first-party fit,🧩 ecosystem fit,⚠️ partial 或依赖配置,❌ checked first-party equivalent 不存在,📊 本仓库测量。

能力LoggerJSPinoWinstonLogTapeBunyan
Node server logging✅ first-party✅ first-party✅ first-party✅ first-party✅ first-party
Browser runtime✅ first-party⚠️ browser API⚠️ not primary✅ first-party⚠️ bundler support
Library-safe default✅ silent until configured⚠️ app-oriented⚠️ app-oriented✅ core design⚠️ app-oriented
Automatic browser capture✅ 19 first-party integrations❌ none checked❌ none checked❌ none checked❌ none checked
Automatic Node collection✅ 16 first-party integrations🧩 ecosystem⚠️ exceptions/rejections✅ framework packages⚠️ stream/custom
Multi-destination delivery✅ transports✅ transports✅ transports✅ sinks✅ streams
Built-in batching/retry/offline✅ shared primitives⚠️ transport-dependent⚠️ transport-dependent⚠️ sink-dependent⚠️ stream-dependent
Transport-owned codecs✅ explicit boundary⚠️ logger/transport formatting⚠️ format pipeline⚠️ sink formatting⚠️ serializers
Privacy/redaction✅ processors + sanitizers✅ built-in redaction⚠️ custom formats✅ redaction package⚠️ serializers/custom
Direct Node JSON path✅ M1 上 1.19x pino📊 baseline(同级;其他 CPU/V8 上可领先)❌ measured slower❌ measured slowerNot measured here

详细矩阵

维度LoggerJSPinoWinstonLogTapeBunyan
Primary fit带 automatic collection 和可靠 delivery 的同构结构化日志低开销 Node JSON logging成熟 format/transport model 的灵活 Node logger跨 JS runtimes 的 library-first structured loggingNode services 的简单 JSON logging
Runtime posture@loggerjs/core 平台中立;first-party Node 和 browser packages 按 runtime 拆分Node-first,带文档化 browser APINode-first;browser 不是主要文档路径first-party 支持 Node、Deno、Bun、browsers、Cloudflare Workers 和 edgeNode services;文档提到 Browserify/Webpack/NW.js support
Library-safe default是:getLogger() 在宿主配置前保持 silent部分:库可以接收/注入 logger,但 Pino 本身偏 app-oriented部分:库可以接收/注入 logger,但 Winston 本身偏 app-oriented是:core design goal部分:child loggers 有帮助,但预期 app-level configuration
Structured data是:records/events 保留 message、data、context、tags、trace、source、type是:默认 JSON logs是:mutable info objects 加 formats是:structured log records/properties是:JSON records
Levels兼容 Pino 的 numeric levels 加 names内置 numeric levels 和 custom levelsRFC5424-style levels 加 custom levels带 category configuration 的 severity levelsNumeric levels
Category/logger modelCategory arrays、child loggers、registry configurationChild loggers 和 bindingsLogger instances、child loggers、containers带 sink inheritance 的 hierarchical categoriesLogger name 加 child loggers;文档说 names 非层级
Middleware/filter layerfirst-party middleware/processors:enrich、redact、sample、dedupe、route、rate-limit、fingerprint、normalizeHooks、serializers、mixins、redaction;更广 middleware 通常是 app/ecosystem codeFormat chains 和 custom formats;mutable object pipelineFilters、contexts、formatters、redaction packageSerializers 和 custom streams
Serialization ownershipCodec 属于每个 transport;内置 JSON、safe JSON、NDJSON、fast-event-json、msgpackr、OTLP JSONCore JSON serialization 加 serializers/formatters 和 transport outputFormat chain 为每个 logger/transport 最终化输出Sinks 和 formatters 拥有输出JSON records 加 serializers
Transport/sink modelfirst-party console、pretty DevTools/terminal output、memory、test、batch、stdout/stderr、file、rotating file、HTTP、syslog、worker、browser HTTP、IndexedDB、WebSocket、service worker、BroadcastChannel、OTLP、Sentry、Datadog、Elasticsearch、Loki、CloudWatch、SQLite/Postgres/custom DBDestination/transport API、multi-target transports、pino/filepino-pretty 和 ecosystem transports内置 console/file/http/stream-style transports 和广泛 custom transport ecosystemCore 中的 console/stream sinks,以及 file、OTEL、Sentry、syslog、CloudWatch、Windows Event Log 等 packagesstdout/file/rotation/raw/custom streams
Automatic browser collection19 个 first-party browser/frontend integrations:console、script/resource errors、unhandled rejection、fetch、XHR、Web Vitals、performance entries、user actions、router adapters、ReportingObserver、service worker、WebSocket、framework error hooks、runtime host、browser context propagationBrowser API 可直接 logging;checked docs 未发现等价 LoggerJS browser capture suitechecked docs 未发现等价 LoggerJS browser capture suite支持 browser runtime;checked docs 未显示等价 browser capture/offline suitechecked docs 未发现等价能力
Automatic Node collection16 个 first-party Node.js/server integrations:process、diagnostics_channel、Express、Fastify、Koa、Hapi、Nest middleware、fetch、http client、CLI、serverless、queue、BullMQ、Prisma、Redis、generic DB clientsFastify/Pino、pino-http 等 ecosystem integrations 常见;core docs 覆盖 logger/transports内置 uncaught exception 和 unhandled rejection handling;framework request logging 通常是 ecosystem codefirst-party framework integration packages 包括 Express、Fastify、Hono、Koa 和 Drizzlechecked docs 未显示广泛 first-party instrumentation suite
Browser persistence/exportfirst-party IndexedDB transport、IndexedDB HTTP offline queue、pagehide flush、ZIP exportchecked docs 未发现 first-party equivalentchecked docs 未发现 first-party equivalentchecked core docs 未发现 first-party equivalentchecked docs 未发现 first-party equivalent
Delivery reliability共享 batching、retry/backoff、byte limits、circuit breaker、flush/flushSync/close、适用时 offline queues高吞吐 stream/transport model;transport startup caveats 有文档Transport model 带 exceptions/rejections、querying、streaming、close/await guidanceSink model 带 category/filter/context control;reliability 取决于 chosen sink packagesStream model;reliability 取决于 chosen streams
Privacy controlsRedaction、privacy guard、normalize-error、safe codecs、integration 中 URL/header sanitizers使用 fast-redact 的内置 path redactionFormatting 和 custom transforms;checked README 中无 built-in redaction claimRedaction package 和 filtersSerializers/custom streams
Context propagationChild loggers、bindings、tags、withContext()、Node AsyncLocalStorage installerChild loggers、bindings、mixins;async context 是 app/ecosystem codeChild logger metadata;async context 是 app/ecosystem codeExplicit 和 implicit contexts,带 configurable context local storageChild loggers 和 serializers
TypeScript posturefirst-party TypeScript source/declarations、typed events、subpath exportsTypes included in package ecosystemTypes included in package ecosystemTypeScript-first package历史 Node package,带 TypeScript ecosystem support
Dependency posture@loggerjs/core 无 dependencies;完整 workspace packages 只增加目标依赖,例如 @loggerjs/codecs 中的 msgpackr小 core,加 focused dependencies成熟但更大的 dependency graph@logtape/logtape zero dependencies较老 package,某些功能有 optional deps

性能快照

当前测量快照来自 基准 和签入的 基准矩阵:参考机器 Apple M1 Max(64 GB)、Node v22.21.1、pino 10.3.1、winston 3.19.0、LogTape 2.1.3。loggerjs-vs-pino 行来自 drift-canceling paired A/B(22 runs);竞争者 landscape 行来自顺序套件:

Scenarions/op解读
loggerjs disabled debug, lazy message3Disabled level path 与 pino 同级
pino disabled debug9同一等级开销
loggerjs prepared lean record sink224Codec-owned prepared encoder,paired A/B 下 1.28x pino
loggerjs lean record sink242fastEventJsonCodec lean JSON,paired A/B 下 1.19x pino
pino NDJSON noop sink287Direct JSON path;baseline
loggerjs full-envelope record sink307额外 idseqlevelName,约 0.9x pino
node console info noop stream769比 loggerjs lean sink 慢约 3x
winston JSON noop sink2,726比 loggerjs lean sink 慢约 11x
LogTape JSON lines noop sink6,584比 loggerjs lean sink 慢约 27x

诚实解读:

  • 在 M1 Max 参考机器上,LoggerJS lean 和 prepared 在等价输出下 快于 Pino(1.19x / 1.28x,paired A/B,22 runs 可复现)。这 不是 普遍“beats Pino”声明:排序依赖 CPU/Node-V8,文档把差异当成经验 benchmark 结果,而不是已证明机制。请在你的硬件上用 BENCH_AB=1 pnpm bench:node 复现,并用 pnpm bench:matrix 增加持久跨机器证据。
  • LoggerJS 在等价输出上达到 Pino 同级,没有 放弃自己的 record pipeline。这个 pipeline 是设计目标,不是意外 overhead。
  • Record pipeline 换来 first-class middleware、integrations、multi-transport routing、codec selection 和 browser/server symmetry。
  • 这些数字没有比较每一种 Pino transport、Winston format chain、LogTape sink 或 browser scenario。

LoggerJS 更强的地方

浏览器和同构应用

LoggerJS 有 first-party browser transports 和 integrations:console capture、script/resource errors、fetch/XHR failures、Web Vitals、page lifecycle flushing、router events、user actions、WebSocket lifecycle、service worker lifecycle、ReportingObserver、IndexedDB persistence、offline HTTP queues 和 ZIP export。

这是和 Pino、Winston、Bunyan 最大的实际差异。这些库可以不同程度在浏览器中使用,但 checked docs 没有显示与 LoggerJS 等价的 first-party automatic browser collection 和 local persistence suite。

Transport-Owned Codecs

LoggerJS 在 transport 边界前保持结构化原始值。Serialization 是 transport 关注点,所以 stdout 可以用 NDJSON,browser HTTP 可以用 safe JSON 或 lean fast codec,OTLP 可以用 OTLP shape,自定义 transport 可以用 MessagePack 或 domain-specific projection。

这不同于常见 logger-level formatter model。多目的地 logging 会更少意外,因为每个目的地拥有自己的 wire contract。

内置可靠性 Primitives

LoggerJS 把常见投递控制作为可复用组件提供:batch transport、retry/backoff、byte limits、circuit breaker behavior、flush/close lifecycle、browser sendBeacon、IndexedDB offline queues,以及适用处的 transport stats。目标是:写 remote transport 时实现 destination,而不是重写 reliability layer。

Automatic Collection 是一等概念

LoggerJS integrations 显式、可逆,并通过与手动日志相同的管线路由。捕获日志仍经过 middleware、processors、routing、codecs 和 transports。对隐私很重要,因为 redaction 和 sampling 可以集中处理。

什么时候其他 Logger 更合适

主要需求是最小 Node JSON Logging 时选 Pino

Pino 仍是低开销 Node JSON logging 的参照点,并有成熟 Node web service 生态。当前 LoggerJS paired A/B 数字让 lean/prepared 等价输出路径在 M1 Max 参考机器上领先,但这个排序依赖 CPU/Node-V8。如果应用只需要 app-authored server logs 到 stdout 或 Pino transport,Pino 仍是更简单且更久经验证的选择。

需要成熟 Transport/Format 生态时选 Winston

Winston 广泛、稳定、灵活。它的 format chain 和 transport model 在许多 Node 应用中熟悉;README 记录了 exception handling、rejection handling、profiling、querying、streaming、custom formats 和 custom transports。已有 Winston 部署只有在 LoggerJS 的同构采集、middleware model 或测得的性能收益足以抵消迁移成本时才值得迁移。

Multi-Runtime Library-First Logging 优先时选 LogTape

对库作者而言,LogTape 是与 LoggerJS 最接近的概念同行。其官方 package page 强调 zero dependencies、library-first design、structured logging、hierarchical categories、runtime diversity、redaction 和 framework integration packages。如果 Deno/Bun/edge parity 和 core package zero dependencies 是最高优先级,LogTape 很适合。

当 first-party browser telemetry capture、IndexedDB/offline workflows、Node process/client/server integrations、transport-owned codecs,以及当前相对 pino 的 Node benchmarks 更重要时,选择 LoggerJS。

Legacy Node JSON 兼容时选 Bunyan

如果已有服务已经输出 Bunyan-shaped JSON,或依赖 Bunyan CLI/stream ecosystem,Bunyan 仍然相关。新 browser/server 应用中,LoggerJS 内置 surface 更广。

其他常见工具

工具最适合与 LoggerJS 的关系
Native console开发输出和简单脚本LoggerJS 可以捕获 console calls 并路由,但 direct console 仍是最简单 debug output。它不是结构化投递管线。
loglevel很小的 browser/Node console method level filtering小得多也简单得多。它不试图提供 transports、codecs、integrations、offline storage 或 vendor delivery。
debug按 namespace、环境/local storage 开关的 debug traces非常适合 library debug traces。它不是结构化生产日志管线。
consolaPretty CLI/browser console output 和 developer tooling UX人类可见 console UX、tags、reporters、console redirection、prompts 很强。LoggerJS 更关注结构化 observability delivery。
tslogTypeScript-friendly pretty/JSON logger for Node and browserdebugloglevel 更接近完整 logger,并支持 attachable transports。LoggerJS 有更广的 first-party automatic collection、transport reliability 和 vendor/browser persistence surface。

迁移摩擦

LoggerJS 有意在几个地方与 Pino 和 Winston 不同:

  • 普通日志使用 (message, data);Pino 常用 (object, message)
  • 稳定 metadata 拆分到 tagsbindings 和 ambient context,而不是一个通用 defaultMetabase 对象。
  • 数据塑形属于 middleware/processors;序列化属于挂在 transports 上的 codecs。
  • Automatic capture 是 opt-in。添加 captureConsoleIntegration()captureFetchIntegration() 是显式且可逆的。

示例见 迁移

我们不该宣称的话

除非新增证据,否则 marketing 和 README claims 应保持在这些边界内:

  • 不要宣称 LoggerJS 普遍快于 Pino。测得的 direct Node JSON 排序依赖 CPU/Node-V8;引用 benchmark matrix 中具体测试机器。
  • 不要在仓库还没有对应 runtime 测试和 package metadata 前宣称完整 Deno/Bun first-party support。
  • 不要宣称每个 vendor feature 都比 ecosystem plugins 更丰富。LoggerJS 有意提供常见目的地的 wire-protocol transports;成熟 vendor SDK 可能暴露更深的平台特定行为。
  • 不要宣称 browser automatic collection 在所有 packages 中唯一。可支持的说法是:在 Pino、Winston、LogTape、Bunyan 的 checked docs 中,没有找到等价 first-party suite。
  • 不要使用旧 benchmark snapshots。改变性能声明前重新运行 pnpm bench:node

相关链接

基于 MIT License 发布。