UNPKG

operations

Version:

A library for managing complex chains of asynchronous operations in Javascript.

94 lines (79 loc) 3.2 kB
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;