Уинстон: как вращать логи
Как я могу вращать журналы при использовании Winston для обработки журналов для node.js. То есть, как я могу создавать новый файл для каждого дня работы приложения?
var logger = new (winston.Logger)({
transports: [
new (winston.transports.Console)(),
new (winston.transports.File)({ filename: '2012-07-09.log' })
]
});
logger.log('info', 'Test Log Message', { anything: 'This is metadata' });
6 ответов
Уинстон автор и сопровождающий здесь.
Вход в новый файл каждый день в настоящее время является открытым запросом: https://github.com/flatiron/winston/issues/10. Хотелось бы, чтобы кто-то реализовал это.
Тем не менее, есть и другие варианты:
Транспортный файл принимает параметр maxsize, который будет вращать файл журнала, когда он превышает определенный размер в байтах.
Существует также открытый пул-запрос с новым транспортом, который у меня не было возможности по-настоящему копать в "fileRotate", который, похоже, выполняет такой поворот на основе даты: https://github.com/flatiron/winston/pull/120/files
Функция присутствует, и мы используем ее в производстве, winston.transports.DailyRotateFile:
var timeFormatFn = function() {
'use strict';
return moment().format(cfg.timeFormat);
};
var logger = new(winston.Logger)({
exitOnError: false,
transports: [
new(winston.transports.DailyRotateFile)({
filename: cfg.appLogName,
dirname: __dirname + '/../' + cfg.logsDirectory,
datePattern: cfg.rollingDatePattern,
timestamp: timeFormatFn
}),
new(winston.transports.Console)({
colorize: true,
timestamp: timeFormatFn
})
]
});
Вы можете использовать следующий код для ежедневного вращения файлов журнала:
var winston = require('winston');
require('winston-daily-rotate-file');
var transport = new (winston.transports.DailyRotateFile)({
filename: './log',
datePattern: 'yyyy-MM-dd.',
prepend: true,
level: info
});
var logger = new (winston.Logger)({
transports: [
transport
]
});
logger.info('Hello World!');
По словам автора https://github.com/CycoPH/winston-filerotatedate это:
Транспорт файлов для winston, позволяющий вращать файлы журнала в зависимости от размера и времени.
Транспортный файл принимает имя файла через опцию "имя файла" и использует этот файл в качестве основной цели ведения журнала. Если размер файла превышает максимальный размер байта, текущий файл журнала переименовывается и создается новая основная плитка журнала. Имя переименованного файла журнала форматируется как "basenameYYYYMMDD[az].bak".
Доступные варианты:
- уровень: уровень сообщений, которые этот транспорт должен регистрировать.
- silent: логический флаг, указывающий, следует ли подавлять вывод.
- timestamp: логический флаг, указывающий, следует ли нам добавлять вывод к отметкам времени (по умолчанию true). Если указана функция, вместо меток времени будет использоваться ее возвращаемое значение.
- filename: имя файла журнала, в который записывается вывод.
- dirname: папка, в которой будет создан файл журнала.
- maxsize: максимальный размер в байтах файла журнала, если размер превышен, то создается новый файл.
- json: если true, сообщения будут регистрироваться как JSON (по умолчанию true).
Другие люди уже дали хорошие ответы на эту проблему. Но тем, кто ищет пример того, как это сделать в более современном синтаксисе JavaScript (ES6 и выше) с использованием winston-daily-rotate-file, может помочь следующий код:
const { createLogger, transports } = require('winston');
require('winston-daily-rotate-file');
const logger = createLogger({
level: 'info',
transports: [
new transports.DailyRotateFile({
filename: 'info-%DATE%.log',
datePattern: 'YYYY-MM-DD',
zippedArchive: true,
level: 'info'
})
]
});
logger.log('info', 'Test Log Message', { anything: 'This is metadata' });
С 18 декабря 2012 г. эта функция теперь доступна в Winston (см. https://github.com/flatiron/winston/pull/205).