在我的网络分析中,我将数据记录在纯文本文件中。我想每天轮换日志,因为它记录了太多数据。目前我正在使用bunyan来旋转日志。
我面临的问题
它正在正确旋转文件,但旋转的日志文件在名称log.0
中log.1
,等等。我希望文件名是log.05-08-2013
,log.04-08-2013
我无法编辑bunyan
包的源代码,因为我们正在package.json
通过 NPM 安装模块。
所以我的问题是——Node.js 中是否还有其他符合我要求的日志轮换?
在我的网络分析中,我将数据记录在纯文本文件中。我想每天轮换日志,因为它记录了太多数据。目前我正在使用bunyan来旋转日志。
我面临的问题
它正在正确旋转文件,但旋转的日志文件在名称log.0
中log.1
,等等。我希望文件名是log.05-08-2013
,log.04-08-2013
我无法编辑bunyan
包的源代码,因为我们正在package.json
通过 NPM 安装模块。
所以我的问题是——Node.js 中是否还有其他符合我要求的日志轮换?
如果除了按日期保存日志之外,还想添加 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();
}
});
winston 本身不支持日志轮换。我的错。
mongodb 有一个日志轮换用例。然后,您可以根据需要将日志导出为文件名。
winston 也有一个 mongodb 传输,但从它的 API 来看,我认为它不支持开箱即用的日志轮换。
不过,这可能有点矫枉过正。
你可以 fork bunyan 并将你的 repo 的 url 添加到package.json
.
如果您可以冻结 bunyan 的功能或维护自己的代码,这是最简单的解决方案。
由于它是一个开源项目,您甚至可以向其中添加您的功能并提交拉取请求以帮助改进 bunyan。