webappengine
Version:
A web application platform that can host multiple web apps running with Node.js.
149 lines (131 loc) • 4.61 kB
JavaScript
var _ = require('lodash'),
cluster = require('cluster'),
winston = require('winston'),
util = require('util'),
fs = require('fs'),
path = require('path');
// String utils
require('colors');
require('string-format');
// Default settings
var defaultSettings = {
levels: {
trace: 0,
debug: 1,
info: 2,
warn: 3,
error: 4
},
colors: {
trace: 'magenta',
debug: 'blue',
info: 'green',
warn: 'yellow',
error: 'red'
},
exitOnError: function(err) {
console.log('Error:', err);
return false;
}
};
// Store the logger instance
var logger;
function meta() {
var _meta = {};
if (cluster.isMaster) {
_meta.id = 0;
_meta.pid = process.pid;
} else if (cluster.isWorker) {
_meta.id = cluster.worker.id;
_meta.pid = cluster.worker.process.pid;
}
return { meta: _meta };
}
// https://code.google.com/p/v8/wiki/JavaScriptStackTraceApi
var getStackTrace = function() {
var obj = {};
Error.captureStackTrace(obj, getStackTrace);
return (obj.stack || '').split('\n');
};
module.exports = function() {
var arr = [];
if (logger.settings.prefix) { // prefix
arr.push(logger.settings.prefix);
}
return {
log: function() {
var args = Array.prototype.slice.call(arguments);
var level = args.shift();
var stackTrace = getStackTrace()[2];
logger.log(level, util.format.apply(util.format, arr.concat(args).concat(stackTrace)), meta());
},
trace: function() {
var args = Array.prototype.slice.call(arguments);
var stackTrace = getStackTrace()[2];
logger.trace(util.format.apply(util.format, arr.concat(args).concat(stackTrace)), meta());
},
debug: function() {
var args = Array.prototype.slice.call(arguments);
var stackTrace = getStackTrace()[2];
logger.debug(util.format.apply(util.format, arr.concat(args).concat(stackTrace)), meta());
},
info: function() {
var args = Array.prototype.slice.call(arguments);
var stackTrace = getStackTrace()[2];
logger.info(util.format.apply(util.format, arr.concat(args).concat(stackTrace)), meta());
},
warn: function() {
var args = Array.prototype.slice.call(arguments);
var stackTrace = getStackTrace()[2];
logger.warn(util.format.apply(util.format, arr.concat(args).concat(stackTrace)), meta());
},
error: function() {
var args = Array.prototype.slice.call(arguments);
var stackTrace = getStackTrace()[2];
logger.error(util.format.apply(util.format, arr.concat(args).concat(stackTrace)), meta());
}
};
};
module.exports.init = function(settings) {
_.each([ // return the directory name
path.dirname(settings.transports.File.filename),
path.dirname(settings.exceptionHandlers.File.filename)
], function(logDir) {
if ( ! fs.existsSync(logDir)) {
// Create the directory if it does not exist
fs.mkdirSync(logDir);
}
});
if (cluster.isMaster) {
settings.transports.File.filename = util.format(settings.transports.File.filename, '');
settings.exceptionHandlers.File.filename = util.format(settings.exceptionHandlers.File.filename, '');
} else if (cluster.isWorker) {
settings.transports.File.filename = util.format(settings.transports.File.filename, ':' + cluster.worker.id);
settings.exceptionHandlers.File.filename = util.format(settings.exceptionHandlers.File.filename, ':' + cluster.worker.id);
}
logger = new (winston.Logger)(defaultSettings);
if ( ! settings.transports) {
return;
}
if (settings.transports.Console) {
logger.add(winston.transports.Console, settings.transports.Console);
}
if (settings.transports.File) {
logger.add(winston.transports.File, settings.transports.File);
}
if (settings.exceptionHandlers && settings.exceptionHandlers.File) {
logger.handleExceptions(
new winston.transports.File(settings.exceptionHandlers.File)
);
}
logger.settings = settings;
return module.exports;
};
module.exports.registerAppHelper = function(app) {
if (app.helpers) {
app.helpers({logger: module.exports()});
} else {
app.locals.logger = module.exports();
}
return module.exports;
};