Ротация журнала в Node.js?

В моей веб-аналитике я регистрирую данные в текстовом файле. Я хочу ежедневно менять журнал, потому что он регистрирует слишком много данных. В настоящее время я использую bunyan для ротации журналов.

Проблема, с которой я столкнулся

Файл вращается правильно, но файл журнала ротации имеет имя log.0, log.1 и т. д. Я хочу, чтобы имя файла было log.05-08-2013, log.04-08-2013

Я не могу редактировать исходный код пакета bunyan, потому что мы устанавливаем модули с помощью package.json через NPM.

Итак, мой вопрос: есть ли какая-либо другая ротация журналов в Node.js, которая соответствует моему требованию?


person karthick    schedule 05.08.2013    source источник
comment
Я так не думаю, может быть, winston может это сделать?   -  person gustavohenke    schedule 05.08.2013
comment
@gustavohenke спасибо. Если не возражаете, помогите мне настроить винстон.   -  person karthick    schedule 05.08.2013
comment
Извините, у меня нет опыта работы с Winston. Я просто знаю, что это очень хорошая и популярная библиотека журналов, больше ничего...   -  person gustavohenke    schedule 05.08.2013


Ответы (4)


Winston поддерживает ротацию журналов с использованием даты в имени файла. Взгляните на этот запрос на вытягивание, который добавляет эту функцию и был объединен четыре месяца назад. К сожалению, документация не указана на сайте, но есть еще один запрос на вытягивание, ожидающий рассмотрения. исправить это. Основываясь на этой документации и тестах функций ротации журналов, вы сможете просто добавить его в качестве нового транспорта, чтобы включить функцию ротации журналов. Что-то вроде следующего:

winston.add(winston.transports.DailyRotateFile, {
  filename: './logs/my.log',
  datePattern: '.dd-MM-yyyy'
});
person Timothy Strimple    schedule 08.08.2013
comment
Хороший! Это то, что ищет ОП. - person Kurt Pattyn; 12.08.2013
comment
Теперь этот транспорт перемещен в собственный модуль npm: github.com/winstonjs/winston- ежедневная ротация файла - person Mike Stumpf; 04.12.2015
comment
Ротация журналов сейчас не работает, есть ошибка github.com/winstonjs/winston/issues /477 - person Danny G; 23.01.2016

Если вы также хотите добавить 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;
person kerbelp    schedule 18.05.2014
comment
Проголосовали против, так как у вас есть 9-уровневая глубокая вложенность в коде. Это не должно распространяться! )) - person Artur Aleksanyan; 16.02.2019
comment
@ArturAleksanyan, хотя это читабельно. Не говорю, что это нельзя написать лучше, но нет необходимости минусовать кого-то за попытку помочь, с легко читаемым ответом, из ответа вы можете понять, что он делает и почему он это делает. - person pourmesomecode; 23.09.2019

Существует модуль 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();
  }
});
person fujifish    schedule 21.05.2016
comment
Кажется, опция подсчета не работает. он хранит более 3 повернутых файлов. - person Ash; 01.04.2019

монгодб

winston сам по себе не поддерживает ротацию журналов. Плохо.

mongodb имеет вариант использования ротации журналов. Затем вы можете экспортировать журналы в имена файлов в соответствии с вашими требованиями.

У winston также есть транспорт mongodb, но я не думаю, что он поддерживает ротацию журналов из коробки, судя по его API.

Хотя это может быть излишеством.

разветвляющийся баньян

Вы можете разветвить bunyan и добавить URL-адрес вашего репо в package.json.

Это самое простое решение, если вы не против заморозить функцию bunyan или поддерживать свой собственный код.

Поскольку это проект с открытым исходным кодом, вы даже можете добавить в него свою функцию и отправить запрос на вытягивание, чтобы помочь улучшить bunyan.

person leesei    schedule 06.08.2013