Skip to main content

ADR-0047: Winston for Application Logging

Status

Accepted - 2025-01-26


Context

Application needs structured logging with multiple transports (console, file, Loki).


Decision

Winston 3.x as logging library.

Rationale

  1. Structured JSON: Machine-readable logs
  2. Multiple Transports: Console + File + Loki
  3. Performance: 100k logs/sec
  4. Industry Standard: Most popular Node.js logger

Implementation

See ADR-0035 for integration logging

See ADR-0045 for Loki transport

Configuration

// src/logging/logger.ts
import winston from 'winston';

const logger = winston.createLogger({
level: process.env.LOG_LEVEL || 'info',
format: winston.format.combine(
winston.format.timestamp(),
winston.format.errors({ stack: true }),
winston.format.json()
),
transports: [
new winston.transports.Console(),
new winston.transports.File({ filename: 'error.log', level: 'error' }),
new winston.transports.File({ filename: 'combined.log' }),
],
});

Log Levels

logger.error('Database connection failed', { error: err.message });
logger.warn('Cache miss', { key });
logger.info('Booking created', { bookingId });
logger.debug('Query params', { params });

References