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
JavaScript
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;