operations
Version:
A library for managing complex chains of asynchronous operations in Javascript.
94 lines (79 loc) • 3.2 kB
JavaScript
var _ = require('underscore');
function Logger (name) {
if (!this) return new Logger(name);
this.name = name;
this.trace = constructPerformer(this, _.bind(console.debug ? console.debug : console.log, console), Logger.Level.trace);
this.debug = constructPerformer(this, _.bind(console.debug ? console.debug : console.log, console), Logger.Level.debug);
this.info = constructPerformer(this, _.bind(console.info ? console.info : console.log, console), Logger.Level.info);
this.log = constructPerformer(this, _.bind(console.log ? console.log : console.log, console), Logger.Level.info);
this.warn = constructPerformer(this, _.bind(console.warn ? console.warn : console.log, console), Logger.Level.warning);
this.error = constructPerformer(this, _.bind(console.error ? console.error : console.log, console), Logger.Level.error);
this.fatal = constructPerformer(this, _.bind(console.error ? console.error : console.log, console), Logger.Level.fatal);
}
var logLevels = {};
function constructPerformer (logger, f, level) {
var performer = function (message) {
logger.performLog(f, level, message, arguments);
};
Object.defineProperty(performer, 'isEnabled', {
get: function () {
var currentLevel = logger.currentLevel();
return level >= currentLevel;
},
enumerable: true,
configurable: true
});
performer.f = f;
performer.logger = logger;
performer.level = level;
return performer;
}
Logger.Level = {
trace: 0,
debug: 1,
info: 2,
warning: 3,
warn: 3,
error: 4,
fatal: 5
};
Logger.LevelText = {};
Logger.LevelText [Logger.Level.trace] = 'TRACE';
Logger.LevelText [Logger.Level.debug] = 'DEBUG';
Logger.LevelText [Logger.Level.info] = 'INFO ';
Logger.LevelText [Logger.Level.warning] = 'WARN ';
Logger.LevelText [Logger.Level.error] = 'ERROR';
Logger.levelAsText = function (level) {
return this.LevelText[level];
};
Logger.loggerWithName = function (name) {
return new Logger(name);
};
Logger.prototype.currentLevel = function () {
var logLevel = logLevels[this.name];
return logLevel ? logLevel : Logger.Level.trace;
};
Logger.prototype.setLevel = function (level) {
logLevels[this.name] = level;
};
Logger.prototype.override = function (level, override, message) {
var levelAsText = Logger.levelAsText(level);
var performer = this[levelAsText.trim().toLowerCase()];
var f = performer.f;
var otherArguments = Array.prototype.slice.call(arguments, 3, arguments.length);
this.performLog(f, level, message, otherArguments, override);
};
Logger.prototype.performLog = function (logFunc, level, message, otherArguments, override) {
var self = this;
var currentLevel = override !== undefined ? override : this.currentLevel();
if (currentLevel <= level) {
logFunc = _.partial(logFunc, Logger.levelAsText(level) + ' [' + self.name + ']: ' + message);
var args = [];
for (var i=0; i<otherArguments.length; i++) {
args[i] = otherArguments[i];
}
args.splice(0, 1);
logFunc.apply(logFunc, args);
}
};
module.exports = Logger;