Вращение журнала в Node.js?
В моей веб-аналитике я записываю данные в виде простого текстового файла. Я хочу вращать журнал ежедневно, потому что в нем слишком много данных. В настоящее время я использую Bunyan, чтобы вращать журналы.
Проблема, с которой я сталкиваюсь
Вращается файл правильно, но в названии повернутый файл журнала log.0
, log.1
и т.д. Я хочу, чтобы имя файла было log.05-08-2013
, log.04-08-2013
Я не могу редактировать источник bunyan
пакет, потому что мы устанавливаем модули с помощью package.json
через NPM.
Поэтому мой вопрос: есть ли в Node.js какая-либо другая ротация журналов, которая отвечает моим требованиям?
4 ответа
Winston поддерживает ротацию логов, используя дату в имени файла. Посмотрите на этот запрос на добавление, который добавляет функцию и был объединен четыре месяца назад. К сожалению, документация не указана на сайте, но есть еще один запрос на ожидание, чтобы исправить это. Основываясь на этой документации и тестах функций ротации журналов, вы сможете просто добавить его в качестве нового транспорта, чтобы включить функцию ротации журналов. Что-то вроде следующего:
winston.add(winston.transports.DailyRotateFile, {
filename: './logs/my.log',
datePattern: '.dd-MM-yyyy'
});
Если вы также хотите добавить logrotate (например, удалить журналы, которые старше недели) в дополнение к сохранению журналов по дате, вы можете добавить следующий код:
var fs = require('fs');
var path = require("path");
var CronJob = require('cron').CronJob;
var _ = require("lodash");
var logger = require("./logger");
var job = new CronJob('00 00 00 * *', function(){
// Runs every day
// at 00:00:00 AM.
fs.readdir(path.join("/var", "log", "ironbeast"), function(err, files){
if(err){
logger.error("error reading log files");
} else{
var currentTime = new Date();
var weekFromNow = currentTime -
(new Date().getTime() - (7 * 24 * 60 * 60 * 1000));
_(files).forEach(function(file){
var fileDate = file.split(".")[2]; // get the date from the file name
if(fileDate){
fileDate = fileDate.replace(/-/g,"/");
var fileTime = new Date(fileDate);
if((currentTime - fileTime) > weekFromNow){
console.log("delete fIle",file);
fs.unlink(path.join("/var", "log", "ironbeast", file),
function (err) {
if (err) {
logger.error(err);
}
logger.info("deleted log file: " + file);
});
}
}
});
}
});
}, function () {
// This function is executed when the job stops
console.log("finished logrotate");
},
true, /* Start the job right now */
'Asia/Jerusalem' /* Time zone of this job. */
);
где мой файл журнала:
var path = require("path");
var winston = require('winston');
var logger = new winston.Logger({
transports: [
new winston.transports.DailyRotateFile({
name: 'file#info',
level: 'info',
filename: path.join("/var", "log", "MY-APP-LOGS", "main.log"),
datePattern: '.MM--dd-yyyy'
}),
new winston.transports.DailyRotateFile({
name: 'file#error',
level: 'error',
filename: path.join("/var", "log", "MY-APP-LOGS", "error.log"),
datePattern: '.MM--dd-yyyy',
handleExceptions: true
})
]});
module.exports = logger;
Есть модуль logrotator для ротации логов, который вы можете использовать независимо от механизма регистрации.
Вы можете указать format
возможность форматировать формат даты (или любой другой формат в этом отношении)
var logrotate = require('logrotator');
// use the global rotator
var rotator = logrotate.rotator;
// or create a new instance
// var rotator = logrotate.create();
// check file rotation every 5 minutes, and rotate the file if its size exceeds 10 mb.
// keep only 3 rotated files and compress (gzip) them.
rotator.register('/var/log/myfile.log', {
schedule: '5m',
size: '10m',
compress: true,
count: 3,
format: function(index) {
var d = new Date();
return d.getDate()+"-"+d.getMonth()+"-"+d.getFullYear();
}
});
MongoDB
Сам Winston не поддерживает ротацию логов. Виноват.
У mongodb есть вариант использования ротации журналов. Затем вы можете экспортировать журналы в имена файлов в соответствии с вашими требованиями.
У winston также есть транспорт mongodb, но я не думаю, что он поддерживает ротацию логов из коробки, судя по его API.
Это может быть излишним, хотя.
разветвление
Вы можете раскошелиться на Bunyan и добавить URL своего репо в package.json
,
Это самое простое решение, если вы хорошо справляетесь с функцией замораживания bunyan или поддерживаете свой собственный код.
Поскольку это проект с открытым исходным кодом, вы даже можете добавить к нему свою функцию и отправить запрос на извлечение, чтобы помочь улучшить bunyan.