var ee2 = require('eventemitter2').EventEmitter2; var util = require('util'); var fs = require('fs'); var colors = require('colors'); var ledger = function(options){ options = (options)?options:{}; this.useColor = (typeof options.useColor=='boolean')?options.useColor:true; this.separator = (typeof options.separator=='string')?options.separator:' > '; this.logStdout = (typeof options.logStdout=='boolean')?options.logStdout:true; this.logFile = (typeof options.logFile=='string')?options.logFile:false; this.logDb = (typeof options.logDb=='boolean')?options.logDb:false; this.dbHost = (typeof options.dbHost=='string')?options.dbHost:'127.0.0.1'; this.dbPort = (options.dbPort)?options.dbPort:'27017'; this.dbName = (typeof options.dbName=='string')?options.dbName:'ledger'; this.dbCollection = (typeof options.dbCollection=='string')?options.dbCollection:'log'; this.dbUser = (typeof options.dbUser=='string')?options.dbUser:false; this.dbPass = (typeof options.dbPass=='string')?options.dbPass:false; this.dbConnectionString = 'mongo://'; if( this.dbUser ){ this.dbConnectionString += this.dbUser + ':' + this.dbPass + '@'; } this.dbConnectionString += this.dbHost + ':' + this.dbPort + '/' + this.dbName; this.timeFormatter = function(date){ return date.toString(); }; if( typeof options.timeFormatter == 'function' ){ this.timeFormatter = options.timeFormatter; } this.now = function(){ return this.timeFormatter( new Date() ).toString(); } ee2.call(this, { wildcard: true, delimiter: '::' }); }; util.inherits(ledger,ee2); module.exports = function( options ){ var logger = new ledger(options); logger._stdout = function(msg){ process.stdout.write(msg); }; logger._file = function(msg){ fs.open(logger.logFile, 'a+', function(err,fd){ fs.write(fd, msg, null, null, null, function(err,written,buffer){ fs.close(fd); }); }); }; logger._db = function(msg, type){ var obj = { time: logger.now(), type: type, message: msg, timestamp: Math.round( new Date().getTime()/1000.0 ) } var db = new (require('mongolian'))(logger.dbConnectionString, {log:false}); var dbLog = db.collection(logger.dbCollection); dbLog.insert(obj, function(){ db.server.close(); }); }; logger._stderr = function(msg){ process.stderr.write(msg); } logger.log = function(msg){ var now = logger.now(); msg = String(msg); if(logger.logStdout){ logger._stdout( ((logger.useColor)?now.grey:now) + logger.separator + msg + '\r\n' ); } if(logger.logFile){ logger._file(now + logger.separator + 'LOG' + logger.separator + msg + '\r\n'); } if(logger.logDb){ logger._db(msg, 'log'); } logger.emit('log::log', now, msg); }; logger.info = function(msg){ var now = logger.now(); msg = String(msg); if(logger.logStdout){ logger._stdout( ((logger.useColor)?now.grey:now) + logger.separator + ((logger.useColor)?msg.grey:msg) + '\r\n' ); } if(logger.logFile){ logger._file(now + logger.separator + 'INFO' + logger.separator + msg + '\r\n'); } if(logger.logDb){ logger._db(msg, 'info'); } logger.emit('log::info', now, msg); }; logger.warn = function(msg){ var now = logger.now(); msg = String(msg); if(logger.logStdout){ logger._stdout( ((logger.useColor)?now.grey:now) + logger.separator + ((logger.useColor)?msg.yellow:msg) + '\r\n' ); } if(logger.logFile){ logger._file(now + logger.separator + 'WARN' + logger.separator + msg + '\r\n'); } if(logger.logDb){ logger._db(msg, 'warn'); } logger.emit('log::warn', now, msg); }; logger.error = function(msg){ var now = logger.now(); msg = String(msg); if(logger.logStdout){ logger._stdout( ((logger.useColor)?now.grey:now) + logger.separator + ((logger.useColor)?msg.red:msg) + '\r\n' ); } if(logger.logFile){ logger._file(now + logger.separator + 'ERROR' + logger.separator + msg + '\r\n'); } if(logger.logDb){ logger._db(msg, 'error'); } logger.emit('log::error', now, msg); }; console.log = logger.log; console.info = logger.info; console.warn = logger.warn; console.error = logger.error; return logger; };