define(["lib/underscore"], function(_) {
"use strict";
// logs a message
// logFn: console.log, console.warn, or console.error
// name: name of the logger
// messages: array or array-like object of messages
var logMessage = function(logFn, level, name, messages) {
// add a tag as the first message
var prefix = "["+level+"] [Lens."+name+"]";
var args = [prefix].concat(_.toArray(messages));
// we apply in the context of console to avoid an "illegal invocation"
logFn.apply(console, args);
};
/**
* Creates a new logger with the given name
* @param {String} name String to tag messages from the logger with.
*
* @class A logger that prints tagged messages, filtered by the current
* logging level.
* @property {String} name String to tag messages from the logger with.
*
* @name Log
* @private
*/
var Log = function(name) {
/** @alias Log.prototype */
var self = {};
self.name = name;
/**
* Prints a debug message. Takes an arbitrary number of arguments.
*/
self.debug = function() {
if(Log.level >= Log.DEBUG) {
logMessage(console.log, "DEBUG", this.name, arguments);
}
};
/**
* Prints an info message. Takes an arbitrary number of arguments.
*/
self.info = function() {
if(Log.level >= Log.INFO) {
logMessage(console.info, "INFO", this.name, arguments);
}
};
/**
* Prints a warning message. Takes an arbitrary number of arguments.
*/
self.warn = function() {
if(Log.level >= Log.WARN) {
logMessage(console.warn, "WARN", this.name, arguments);
}
};
/**
* Prints an error message. Takes an arbitrary number of arguments.
*/
self.error = function() {
if(Log.level >= Log.ERROR) {
logMessage(console.error, "ERROR", this.name, arguments);
console.trace();
}
};
Object.freeze(self);
return self;
};
_.extend(Log, /** @lends Log */ {
/**
* Log level that displays all messages
*/
DEBUG: 4,
/**
* Log level that displays all messages except debug messages
* @constant
*/
INFO: 3,
/**
* Log level that displays warnings and errors
* @constant
*/
WARN: 2,
/**
* Log level that displays only errors
* @constant
*/
ERROR: 1,
/**
* Log level that displays no messages
* @constant
*/
NONE: 0,
/**
* The current logging level. Change this to Log.INFO, Log.WARN,
* Log.ERROR, or Log.NONE to adjust how much logging is done.
*
* @default Log.INFO
*/
level: 3
});
var logger = Log("setLogLevel");
/**
* Sets the logging level. The default logging level is "info"
* @param {String} level One of "debug", "info", "warn", or "error"
*/
Lens.setLogLevel = function(level) {
if(level === "debug") {
Log.level = Log.DEBUG;
}
else if(level === "info") {
Log.level = Log.INFO;
}
else if(level === "warn") {
Log.level = Log.WARN;
}
else if(level === "error") {
Log.level = Log.ERROR;
}
else {
logger.error(level, "is not a valid logging level.");
}
};
return Log;
});