| 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; |