Logging for JavaScript (Node.js): Best Solutions
Logging is a critically important component of any server-side Node.js application. It allows you to track errors, analyze performance, audit user actions, and debug complex scenarios. In this article, we will review the best libraries for logging in Node.js, their features, configuration, and usage examples.
Why is logging needed in Node.js?
Node.js is an asynchronous environment where errors can occur in callbacks, promises, or events. Without quality logging, you risk losing important information about failures. Properly configured logging helps:
- Quickly find and fix bugs in production
- Monitor performance and bottlenecks
- Comply with security and audit requirements
- Analyze user behavior
Key criteria for choosing a library
When choosing a logging tool, pay attention to:
- Performance — minimal impact on application speed
- Transport flexibility — the ability to output logs to console, files, databases, external services
- Logging levels — from debug to fatal
- Formatting — JSON, text, custom
- Asynchronous support — non-blocking writes
Top 4 libraries for logging in Node.js
1. Winston — The Universal Standard
Winston is the most popular library for logging in Node.js. It supports multiple transports, logging levels, and custom formats.
Installation:
npm install winstonConfiguration example:
const winston = require('winston');
const logger = winston.createLogger({ level: 'info', format: winston.format.json(), transports: [ new winston.transports.Console(), new winston.transports.File({ filename: 'error.log', level: 'error' }), new winston.transports.File({ filename: 'combined.log' }) ]});
logger.info('Server started on port 3000');logger.error('Database connection error', { service: 'database' });Pros: huge community, flexibility, ready-made transports for Elasticsearch, Logstash, MongoDB.
Cons: slightly slower than alternatives under high load.
2. Pino — Speed Champion
Pino is an ultra-fast logger built with a focus on performance. It generates logs in JSON format and is 5-10 times faster than Winston.
Installation:
npm install pinoUsage example:
const pino = require('pino');
const logger = pino({ level: 'info', transport: { target: 'pino-pretty', // for pretty console output options: { colorize: true } }});
logger.info({ user: 'admin' }, 'User logged in');logger.error(new Error('Insufficient permissions'), 'Access denied');Pros: minimal performance impact, excellent async support, Elastic integration.
Cons: harder to configure custom formats than in Winston.
3. Bunyan — Simplicity and Structure
Bunyan is a lightweight library from Joyent that generates structured JSON logs. It is ideal for microservice architecture.
Installation:
npm install bunyanExample:
const bunyan = require('bunyan');const logger = bunyan.createLogger({ name: 'myapp', level: 'info', streams: [ { level: 'info', stream: process.stdout }, { level: 'error', path: 'error.log' } ]}); Also in library
PHP Application Monitoring: Tools and Libraries for Performance Tracking
Authorization and Authentication in C# (.NET) — Complete Guide
Sending SMS in Swift (iOS/macOS): MessageUI Library API
Redis Client (Jedis) for Java: Complete Guide with Examples
Task Queues in Java: From ThreadPoolExecutor to Disruptor