blob: 769e8917c64c42bb85a2b549ff841e56065622cf [file] [log] [blame]
var util = require('util');
var LogDriver = function(options){
options = options || {};
var logger = this;
if (options.format){
this.format = options.format;
}
this.levels = options.levels || ['error', 'warn', 'info', 'debug', 'trace'];
if (options.level === false){
this.level = false; // don't log anything
} else {
this.level = options.level || this.levels[this.levels.length - 1];
if (this.levels.indexOf(this.level) === -1){
throw new Error("Log level '" +
this.level +
"' does not exist in level list '" + JSON.stringify() + "'");
}
}
this.levels.forEach(function(level){
if (logLevelShouldOutput(level, logger.level, logger.levels)){
logger[level] = function(){
var args = Array.prototype.slice.call(arguments);
args.unshift(level); // log level is added as the first parameter
console.log(logger.format.apply(logger, args));
};
} else {
logger[level] = function(){/* no-op, because this log level is ignored */};
}
});
};
var logLevelShouldOutput = function(logLevel, configuredLevel, levels){
if (configuredLevel === false){
return false;
}
return (levels.indexOf(logLevel) <= levels.indexOf(configuredLevel));
};
LogDriver.prototype.format = function(){
var args = Array.prototype.slice.call(arguments, [1]); // change arguments to an array, but
// drop the first item (log level)
var out = "[" + arguments[0] + "] " + JSON.stringify(new Date()) + " ";
args.forEach(function(arg){
out += " " + util.inspect(arg);
});
return out;
};
var defaultLogger = null;
var factory = function(options){
defaultLogger = new LogDriver(options);
factory.logger = defaultLogger;
return defaultLogger;
};
factory();
module.exports = factory;