@vizydrop/logger
Version:
Vizydrop predefined logger based on winston v3
105 lines (91 loc) • 2.99 kB
JavaScript
/*********************************************************************
* © Copyright IBM Corp. 2026
*********************************************************************/
const winston = require(`winston`);
const {createLoggerWrapper} = require(`./createLoggerWrapper`);
const {create: createAdditionalFieldsStorage} = require(`./additionalFields`);
const {productionLogFormat} = require(`./productionLogFormat`);
winston.addColors({
trace: `bold blue`,
fatal: `bold red`,
});
function getFormats(mode, correlationIdConfig) {
const {format} = winston;
if (mode === `production`) {
return [
format.timestamp(),
format.splat(),
format.json(),
format(productionLogFormat)(),
];
}
return [
format.colorize(),
format.timestamp(),
format.splat(),
format.simple(),
format.printf((msg) => {
const {stack, level, message = ``, timestamp, ...rest} = msg;
let formattedMessage = `${timestamp} - ${level}: ${message}`;
if (correlationIdConfig.enabled) {
const correlationIdFieldName =
correlationIdConfig.fieldName || `correlationId`;
const correlationIdValue = rest[correlationIdFieldName];
delete rest[correlationIdFieldName];
if (correlationIdValue) {
formattedMessage = `${timestamp} (${correlationIdValue}) - ${level}: ${message}`;
}
}
if (rest && Object.keys(rest).length > 0) {
formattedMessage = `${formattedMessage}\n${JSON.stringify(
rest,
null,
2,
)}`;
}
if (stack) {
formattedMessage = `${formattedMessage}\n${stack}`;
}
return formattedMessage;
}),
];
}
function createLogger(opts = {}) {
const {
mode,
level: minLevel,
correlationId: correlationIdConfig = {},
additionalFields: initialAdditionalFields,
transports = [],
metadata: metadataConfig = {},
} = opts;
const levels = {
...winston.config.cli.levels,
trace: 4,
fatal: 0,
};
const logger = winston.createLogger({
levels,
format: winston.format.combine(
...getFormats(mode, correlationIdConfig),
),
level: minLevel || `info`,
transports: [
new winston.transports.Console({
handleExceptions: true,
}),
...transports,
],
exitOnError: false,
});
const additionalFieldsStorage = createAdditionalFieldsStorage(
initialAdditionalFields,
);
return createLoggerWrapper({
logger,
correlationIdConfig,
additionalFieldsStorage,
metadataConfig,
});
}
module.exports = {createLogger};