#1 Data Analytics Program in India
₹2,499₹1,499Enroll Now
4 min read
Question 38 of 62medium

How to implement logging in Node.js?

Structured logging with Winston and Pino.

What You'll Learn

  • Why structured logging
  • Winston setup
  • Pino for performance

Winston

$ terminalBash
npm install winston
code.jsJavaScript
const winston = require('winston');

const logger = winston.createLogger({
  level: 'info',
  format: winston.format.combine(
    winston.format.timestamp(),
    winston.format.json()
  ),
  transports: [
    new winston.transports.File({ filename: 'error.log', level: 'error' }),
    new winston.transports.File({ filename: 'combined.log' })
  ]
});

// Add console in development
if (process.env.NODE_ENV !== 'production') {
  logger.add(new winston.transports.Console({
    format: winston.format.simple()
  }));
}

// Usage
logger.info('Server started', { port: 3000 });
logger.error('Database error', { error: err.message });

Pino (Faster)

$ terminalBash
npm install pino pino-pretty
code.jsJavaScript
const pino = require('pino');

const logger = pino({
  level: process.env.LOG_LEVEL || 'info',
  transport: {
    target: 'pino-pretty',
    options: { colorize: true }
  }
});

logger.info({ port: 3000 }, 'Server started');
logger.error({ err }, 'Request failed');

Express Middleware

code.jsJavaScript
const pinoHttp = require('pino-http');
app.use(pinoHttp({ logger }));

// Or with Morgan
const morgan = require('morgan');
app.use(morgan('combined'));