Несколько файлов журнала с Winston?
Мы хотели бы использовать Winston для входа в Node.js. Но мы не можем понять, как иметь два файла журнала: один для простых ошибок и один для всего остального.
Выполнение этого наивного способа не работает, однако: добавление нескольких транспортов winston.transports.File
дает ошибку.
Другие столкнулись с этой проблемой, с неопределенными намеками на решение, но никакого реального ответа.
Любые идеи?
Ответы
Ответ 1
Я только что отправил запрос на перенос, который позволяет использовать несколько транспортов файлов в одном регистраторе.
https://github.com/flatiron/winston/pull/149
Он уже слит в flatiron/winston.
Вы также можете использовать мое раздвоенное репо:
https://github.com/pdobrev/winston
Ответ 2
К сожалению, патч, о котором упоминалось в pesho, по-прежнему не включен в официальную версию (см. комментарий stephenbeeson в запрос на извлечение # 149).
Итак, вместо этого я использовал обходное решение. Поскольку Winston сравнивает атрибуты имени, вы можете обмануть его, указав имя самостоятельно:
winston = require 'winston'
logger = new winston.Logger
transports: [
new winston.transports.File
name: 'file#debug'
level: 'debug'
filename: '/tmp/debug.log'
new winston.transports.File
name: 'file#error'
level: 'error'
filename: '/tmp/error.log'
]
logger.error 'error' # both logs
logger.debug 'debug' # on debug log
Возможно, не элегантный, но по крайней мере он работает.
Ответ 3
Тем временем вы можете реализовать рудиментарную оболочку, используя тот же интерфейс, что и
var winston = require('winston');
var configs = require('./env.js');
var debug = new winston.Logger({
levels: {
debug: 0
},
transports: [
new (winston.transports.File)({ filename: configs.PATH_TO_LOG, level: 'debug'}),
new (winston.transports.Console)({level: 'debug'})
]
});
var info = new winston.Logger({
levels: {
info: 1
},
transports: [
new (winston.transports.File)({ filename: configs.PATH_TO_LOG, level: 'info'}),
new (winston.transports.Console)({level: 'info'})
]
});
var warn = new winston.Logger({
levels: {
warn: 2
},
transports: [
new (winston.transports.File)({ filename: configs.PATH_TO_LOG, level: 'warn'}),
new (winston.transports.Console)({level: 'warn'})
]
});
var error = new winston.Logger({
levels: {
error: 3
},
transports: [
new (winston.transports.File)({ filename: configs.PATH_TO_LOG, level: 'error'}),
new (winston.transports.Console)({level: 'error'})
]
});
var exports = {
debug: function(msg){
debug.debug(msg);
},
info: function(msg){
info.info(msg);
},
warn: function(msg){
warn.warn(msg);
},
error: function(msg){
error.error(msg);
},
log: function(level,msg){
var lvl = exports[level];
lvl(msg);
}
};
module.exports = exports;
Это будет охватывать базовый API winston. могут быть расширены для метаданных и т.д.
Ответ 4
Вам просто нужно дать транспорту собственное name
чтобы у вас не было коллизий:
const logger = new (winston.Logger)({
transports: [
new (winston.transports.Console)(),
new (winston.transports.File)({ name: 'text', filename: logFile, json: false }),
new (winston.transports.File)({ name: 'json', filename: logFileJson })
]
});
Вы можете прочитать больше о нескольких транспортах в документации: https://github.com/winstonjs/winston#multiple-transports-of-the-same-type
Ответ 5
Эта функция теперь официально поддерживается в Winston и рассматривается в README здесь
Пример кода:
const logger = winston.createLogger({
level: 'info',
format: winston.format.json(),
defaultMeta: { service: 'user-service' },
transports: [
//
// - Write to all logs with level 'info' and below to 'combined.log'
// - Write all logs error (and below) to 'error.log'.
//
new winston.transports.File({ filename: 'error.log', level: 'error' }),
new winston.transports.File({ filename: 'combined.log' })
]
});
//
// If we're not in production then log to the 'console' with the format:
// '${info.level}: ${info.message} JSON.stringify({ ...rest }) '
//
if (process.env.NODE_ENV !== 'production') {
logger.add(new winston.transports.Console({
format: winston.format.simple()
}));
}