找了很久都没有找到可以按时切换的node.js日志模块,没有办法只好自己实现了下。。。
其实也就是拼凑了一下现成的许多模块。。。这里就不一一引用了。。。
var fs = require('fs');
//var config = require('../config.js').config;
// 对Date的扩展,将 Date 转化为指定格式的String
// 月(M)、日(d)、小时(h)、分(m)、秒(s)、季度(q) 可以用 1-2 个占位符,
// 年(y)可以用 1-4 个占位符,毫秒(S)只能用 1 个占位符(是 1-3 位的数字)
// 例子:
// (new Date()).Format("yyyy-MM-dd hh:mm:ss.S") ==> 2006-07-02 08:09:04.423
// (new Date()).Format("yyyy-M-d h:m:s.S") ==> 2006-7-2 8:9:4.18
Date.prototype.format = function(fmt)
{ //author: meizz
var o = {
"M+" : this.getMonth()+1, //月份
"d+" : this.getDate(), //日
"h+" : this.getHours(), //小时
"m+" : this.getMinutes(), //分
"s+" : this.getSeconds(), //秒
"q+" : Math.floor((this.getMonth()+3)/3), //季度
"S" : this.getMilliseconds() //毫秒
};
if(/(y+)/.test(fmt))
fmt=fmt.replace(RegExp.$1, (this.getFullYear()+"").substr(4 - RegExp.$1.length));
for(var k in o)
if(new RegExp("("+ k +")").test(fmt))
fmt = fmt.replace(RegExp.$1, (RegExp.$1.length==1) ? (o[k]) : (("00"+ o[k]).substr((""+ o[k]).length)));
return fmt;
}
var BUFFER_CHECK_INTERVAL = 2000;// 2s
var BUFFER_FLUSH_LEN = 512;
var LOG_DIRECTORY = "logs/";
var fileMap = {
'info' : {
pathPrefix : 'info.log'
}
};
// initial setting
var curHour = (new Date()).getHours();
function genFilePostfix() {
var dnow = new Date();
return dnow.format('yyyy-MM-dd hh');
}
function genTimeStamp() {
var dnow = new Date();
return dnow.format('h:m:s');
}
function LogFile(options) {
this.pathPrefix = options.pathPrefix;
this.buffers = [];
this.bufferCheckInterval = options.bufferCheckInterval
|| BUFFER_CHECK_INTERVAL;
this.init();
}
LogFile.prototype.push = function(str) {
this.buffers.push(str);
if (this.buffers.length >= BUFFER_FLUSH_LEN) {
this._flush();
}
};
LogFile.prototype._flush = function() {
if (this.buffers.length > 0 && this.stream) {
this.buffers.push('');
var str = this.buffers.join('\n');
this.stream.write(str);
// debug('buffers length: ' + this.buffers.length);
this.buffers = [];
}
};
LogFile.prototype.destroy = function() {
this._flush();
if (this.bufferCheckTimer) {
clearInterval(this.bufferCheckTimer);
this.bufferCheckTimer = null;
}
if (this.stream) {
this.stream.end();
this.stream.destroySoon();
this.stream = null;
}
};
LogFile.prototype.init = function() {
// debug('log init ' + this.pathPrefix);
var self = this;
var path = LOG_DIRECTORY + genFilePostfix() + "." + this.pathPrefix;
// debug(path);
// inspect(conf);
this.stream = fs.createWriteStream(path, {
flags : 'a'
});
this.bufferCheckTimer = setInterval(function() {
self._flush();
}, this.bufferCheckInterval);
};
LogFile.prototype.restart = function() {
this.destroy();
this.init();
};
var logMap = {};
function push2File(str, id) {
var logFile = logMap[id];
var dnow = new Date();
if (dnow.getHours() != curHour) {
// if(dnow.getMinutes() != curMinute){
logFile.restart();
curHour = dnow.getHours();
// curMinute = dnow.getMinutes();
}
logFile.push(dnow.format('yyyy-MM-dd hh:mm:ss') + '\t' + str);
}
//exports.init = function(){
/*
LOG_DIRECTORY += workerId + '/';
if (!fs.existsSync(LOG_DIRECTORY)) {
fs.mkdirSync(LOG_DIRECTORY);
}*/
for ( var id in fileMap) {
logMap[id] = new LogFile(fileMap[id]);
}
//}
exports.info = function(str) {
push2File(str, 'info');
};