В итоге я не нашел пакет, который мне подходит, поэтому я собрал что-то и решил поделиться им. Это базовый c, но делает работу, в которой я нуждался.
Исходный код. Конфигурация представляет собой структуру JSON с записью для конфигурации регистрации.
const loggingConfig = config.logging;
if (!loggingConfig) {
throw new Error('No logging configuration was found');
}
const formatter = printf(({ level, message, label, timestamp, stack }) => {
if (!stack) {
return `${timestamp} [${label}] ${level}: ${message}`;
} else {
return `${timestamp} [${label}] ${level}: ${message}\n ${stack}`;
}
});
const logLabel = 'main';
const formats = {
colorized: combine(
colorize(),
errors({ stack: true }),
label({ label: logLabel }),
timestamp(),
formatter
),
'default': combine(
errors({ stack: true }),
label({ label: logLabel }),
timestamp(),
formatter
)
};
const transports = Object.values(loggingConfig.outputs).map((transportConfig: any) => {
const { type, formatName, ...other } = transportConfig;
let selectedFormat = formats[formatName];
if (!selectedFormat) {
selectedFormat = formats['default'];
}
if (type === 'console') {
return new winston.transports.Console(Object.assign(other, { format: selectedFormat }));
} else if (type === 'file') {
return new winston.transports.File(Object.assign(other, { format: selectedFormat }));
} else {
throw new Error(`Invalid transport configuation in ${JSON.stringify(transportConfig)}`);
}
});
Тогда структура JSON выглядит следующим образом:
{
"logging": {
"outputs": {
"console": {
"type": "console",
"level": "debug",
"formatName": "colorized"
},
"main": {
"type": "file",
"level": "debug",
"filename": "logs/main.log",
"formatName": "default"
}
}
}
}
Этот подход позволяет мне У меня есть другая конфигурация журнала в разработке, на машине непрерывной интеграции и в работе.
Это работает для меня с Winston 3.