import { Request, Response, NextFunction } from 'express'; import pino from 'pino'; /** * Pino structured logger. * - Development: colorized, human-readable output * - Production: JSON for log aggregation */ export const logger = pino({ level: process.env.LOG_LEVEL || 'info', ...(process.env.NODE_ENV !== 'production' && { transport: { target: 'pino-pretty', options: { colorize: true }, }, }), }); /** * Request logging middleware. * Logs method, url, status, and duration for every request. */ export const requestLogger = ( req: Request, res: Response, next: NextFunction ) => { const start = Date.now(); res.on('finish', () => { const duration = Date.now() - start; logger.info({ method: req.method, url: req.url, status: res.statusCode, duration: `${duration}ms`, ip: req.ip, }); }); next(); };