node.js日志模块,可以按时切换

找了很久都没有找到可以按时切换的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');
};


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值