Winston
A battle-tested Node.js logging library with pluggable transports, custom formats, and multiple log levels.
Repository Health
Technical Analysis
Winston is one of the most widely used logging libraries in the Node.js ecosystem, providing a single, consistent API for capturing application logs regardless of where they ultimately end up. Rather than hard-coding console output or file writes, developers configure one or more transports — Console, File, HTTP, or a wide range of community-maintained targets like Elasticsearch, Loggly, or CloudWatch — and let Winston route formatted log records to all of them simultaneously.
Built around Node’s stream primitives, Winston decouples log level filtering, structured metadata, and output formatting (via the companion logform package) from the underlying storage mechanism. This makes it straightforward to run different formats and levels per transport, attach default request-scoped metadata to child loggers, and centrally handle uncaught exceptions and unhandled promise rejections without scattering try/catch blocks throughout an application.
What You Get
- A
createLogger()factory producing loggers with npm-standard (or fully custom) severity levels and per-instance formatting. - Built-in Console, File, HTTP, and Stream transports, plus a stable transport interface for third-party targets.
- Composable formats via the
logformpackage — JSON, printf-style, colorization, timestamps, and error-stack handling. - Centralized exception and unhandled-rejection handlers, child loggers for per-request metadata, and a lightweight profiler for timing operations.
Common Use Cases
- Structured JSON logging for services that ship logs to a centralized aggregator (ELK, Datadog, CloudWatch).
- Multi-destination logging where errors go to a dedicated error.log/alerting transport and everything else goes to a combined log or console.
- Request-scoped logging in web APIs using
logger.child()to automatically attach a request ID to every log line. - Capturing uncaught exceptions and unhandled promise rejections as structured log entries instead of crashing silently.
Under The Hood
Architecture Winston’s core is lib/winston/logger.js, a Logger class extending Node’s Transform stream in object mode. Log calls funnel through .log() or level-shortcut methods generated dynamically in lib/winston/create-logger.js (e.g. .info(), .warn()), which build an info object and call .write(). The _transform() method pushes each info through the configured format pipeline (from the companion logform package) and streams the result to every piped transport via Node’s native .pipe(), so transports (lib/winston/transports/{console,file,http,stream}.js) are just writable streams the Logger writes into. Cross-cutting concerns — exception handling (exception-handler.js), rejection handling (rejection-handler.js), timing (profiler.js), and multi-logger management (container.js) — are implemented as separate collaborator classes composed onto the Logger instance in configure(), keeping the core class focused on the write/pipe pathway.
Tech Stack Winston 3.19.0 is pure CommonJS JavaScript (99% JS, under 1% TypeScript typings in index.d.ts) targeting Node >=12. It depends on a small, purpose-built set of sibling packages from the same winstonjs org — logform (formatting), winston-transport (transport base class), triple-beam (shared Symbols), @dabh/diagnostics (debug logging) — plus readable-stream for consistent stream behavior across Node versions, async for transport iteration, safe-stable-stringify for safe JSON serialization, and @colors/colors for terminal coloring. The build toolchain uses Babel to produce a dist/ browser bundle from the same lib/ source, and Jest (with separate unit/integration configs) drives the test suite.
Code Quality The test suite is substantial and organized (test/unit/winston/**, test/integration/**), covering the logger core, each transport, exception/rejection handlers, the profiler, and the container across 36 test files, using Jest with assume for BDD-style assertions and std-mocks for capturing stdout/stderr. Code style is enforced via a shared ESLint config (@dabh/eslint-config-populist) and Prettier. Naming and structure are consistent (one file per concern under lib/winston/), though some methods (e.g. Logger.log()) branch heavily on arguments.length to preserve backward compatibility with winston@1/2 call signatures, trading some readability for API stability — a tradeoff the maintainers document explicitly in comments and the UPGRADE-3.0.md guide.
API Design The primary API surface — winston.createLogger({ level, format, transports }) plus dynamically generated level methods (.info(), .error(), etc.) — requires very little boilerplate to get started, and the README leads with a working quick-start example. Ergonomics are strong for common cases (logger.child() for scoped metadata, logger.profile() for timing) but the format system, while powerful, has a learning curve: composing format.combine(timestamp(), label(), myFormat) correctly requires understanding the mutable info object and Symbol-keyed properties (LEVEL, MESSAGE, SPLAT) from triple-beam, which isn’t obvious from casual API browsing. Extensive documentation (a 36KB README, a dedicated docs/transports.md, and 25+ runnable examples in examples/) substantially offsets this.
Used by 50 apps in this directory
nango
Authentication · Automation · Developer Tools
Build product integrations with AI using 800+ APIs — auth, proxy, and TypeScript functions on production-grade infrastructure.
NocoBase
Low Code Platforms · No Code Platforms
Open-source AI + no-code platform that lets coding agents and people collaborate to build business systems fast on proven infrastructure.
NodeBB
Community
Modern Node.js forum software with real-time WebSockets, multi-database support, and a plugin ecosystem — the community platform built for the open web and the Fediverse.
Omnivore
Bookmarks Archiving · Knowledge Management · Note Taking
Self-hosted read-it-later platform with highlights, newsletters, PDFs, and seamless Obsidian and Logseq integration.
OpenObserve
Analytics · Devops · Monitoring
Open source observability platform for logs, metrics, traces, and real user monitoring — delivering 140x lower storage costs than Elasticsearch with a single binary you can run in under 2 minutes.
OpenReplay
Analytics
Self-hosted session replay and product analytics suite that lets you see exactly what users do on your web app — without sending data to third parties.
Outline
Collaboration · Knowledge Management
A fast, real-time collaborative knowledge base for growing teams built on React, Node.js, and ProseMirror.
Pangolin
Networking
An open-source, identity-based zero-trust remote access platform built on WireGuard — a self-hostable alternative to Cloudflare Tunnel and Twingate with SSO, OIDC, and tunneled reverse proxying.
Parse Server
Databases · Developer Tools
Self-hosted Backend-as-a-Service for Node.js with REST, GraphQL, real-time Live Query, cloud code, and pluggable adapters for any infrastructure.