UNPKG

kafka-pub-sub

Version:

Enterprise-grade Kafka publish/subscribe library for Node.js — producer pool, batch sending, DLQ, SSL/SASL, multi-broker, and real-world industry examples.

88 lines (80 loc) 2.39 kB
const { logLevel } = require('kafkajs'); const winston = require('winston'); const DailyRotateFile = require('winston-daily-rotate-file'); const toWinstonLogLevel = (level) => { switch (level) { case logLevel.ERROR: case logLevel.NOTHING: return 'error'; case logLevel.WARN: return 'warn'; case logLevel.INFO: return 'info'; case logLevel.DEBUG: return 'debug'; default: return 'info'; } }; /** * Structured JSON log format with timestamp and correlation metadata. */ const jsonFormat = winston.format.combine( winston.format.timestamp({ format: 'YYYY-MM-DDTHH:mm:ss.SSSZ' }), winston.format.errors({ stack: true }), winston.format.json(), ); /** * Human-readable format for console output. */ const consoleFormat = winston.format.combine( winston.format.timestamp({ format: 'YYYY-MM-DDTHH:mm:ss' }), winston.format.colorize(), winston.format.printf(({ timestamp, level, message, namespace, ...meta }) => { const ns = namespace ? `[${namespace}] ` : ''; const extra = Object.keys(meta).length ? ` ${JSON.stringify(meta)}` : ''; return `${timestamp} ${level}: ${ns}${message}${extra}`; }), ); // eslint-disable-next-line no-shadow const WinstonLogCreator = (logLevel) => { const resolvedLevel = toWinstonLogLevel(logLevel); const logger = winston.createLogger({ level: resolvedLevel, defaultMeta: { service: 'kafka-pub-sub' }, transports: [ new winston.transports.Console({ format: consoleFormat, silent: process.env.NODE_ENV === 'test', // suppress in tests }), new DailyRotateFile({ filename: 'logs/kafka-%DATE%.log', datePattern: 'YYYY-MM-DD', zippedArchive: true, maxSize: '20m', maxFiles: '14d', // retain 14 days format: jsonFormat, }), new DailyRotateFile({ level: 'error', filename: 'logs/kafka-error-%DATE%.log', datePattern: 'YYYY-MM-DD', zippedArchive: true, maxSize: '10m', maxFiles: '30d', // retain 30 days for errors format: jsonFormat, }), ], }); return ({ namespace, level, label, log }) => { const { message, ...extra } = log; logger.log({ level: toWinstonLogLevel(level), message, namespace, label, ...extra, }); }; }; module.exports = WinstonLogCreator;