日志在Node.js中的旋转?

在我的网站分析中,我将数据logging在计划文本文件中。 我想每天轮换日志,因为它logging了太多的数据。 目前我正在使用bunyan旋转日志。

Problem facing

它正确地旋转文件,但是旋转日志文件的名字是log.0log.1等。我想要的文件名是log.05-08-2013log.04-08-2013

已知我无法编辑bunyan文件来满足我的要求。 Becoz我们正在使用package.json安装模块

所以我的问题是

在node.js中是否有其他的日志轮换符合我的要求?

Winston支持使用文件名中的date来进行日志的旋转。 看看这个添加function的拉取请求 ,并在四个月前合并。 不幸的是该文档没有在网站上列出,但还有另一个拉动请求正在等待解决。 根据该文档以及日志旋转function的testing,您应该能够将其添加为新的Transport以启用日志旋转function。 像下面这样:

 winston.add(winston.transports.DailyRotateFile, { filename: './logs/my.log', datePattern: '.dd-MM-yyyy' }); 

如果您还想添加logrotate(例如删除超过一周的日志),除了按date保存日志,还可以添加以下代码:

 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. */ ); 

我的logging器文件是:

 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模块,不pipe日志机制如何,都可以使用。

您可以指定format选项来格式化date格式(或任何其他格式)

 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的

温斯顿本身不支持日志旋转。 我的错。

mongodb有一个日志轮转用例 。 然后,您可以根据您的要求将日志导出到文件名称。

温斯顿也有一个mongodb传输,但我不认为它支持日志轮转从框中判断从它的API。

这可能是一个矫枉过正的。

叉bunyan

你可以把bunyan分叉,并在package.json添加你的repo的url。

这是最简单的解决scheme,如果你没有冻结bunyan的function或维护自己的代码。

由于这是一个开源项目,你甚至可以添加你的function,并提交拉请求,以帮助改善bunyan。