aurelia-logging
Version:
A minimal but effective logging mechanism with support for log levels and pluggable log appenders.
181 lines (144 loc) • 3.6 kB
JavaScript
export var logLevel = {
none: 0,
error: 10,
warn: 20,
info: 30,
debug: 40
};
var loggers = {};
var appenders = [];
var globalDefaultLevel = logLevel.none;
var standardLevels = ['none', 'error', 'warn', 'info', 'debug'];
function isStandardLevel(level) {
return standardLevels.filter(function (l) {
return l === level;
}).length > 0;
}
function appendArgs() {
return [this].concat(Array.prototype.slice.call(arguments));
}
function logFactory(level) {
var threshold = logLevel[level];
return function () {
if (this.level < threshold) {
return;
}
var args = appendArgs.apply(this, arguments);
var i = appenders.length;
while (i--) {
var _appenders$i;
(_appenders$i = appenders[i])[level].apply(_appenders$i, args);
}
};
}
function logFactoryCustom(level) {
var threshold = logLevel[level];
return function () {
if (this.level < threshold) {
return;
}
var args = appendArgs.apply(this, arguments);
var i = appenders.length;
while (i--) {
var appender = appenders[i];
if (appender[level] !== undefined) {
appender[level].apply(appender, args);
}
}
};
}
function connectLoggers() {
var proto = Logger.prototype;
for (var _level in logLevel) {
if (isStandardLevel(_level)) {
if (_level !== 'none') {
proto[_level] = logFactory(_level);
}
} else {
proto[_level] = logFactoryCustom(_level);
}
}
}
function disconnectLoggers() {
var proto = Logger.prototype;
for (var _level2 in logLevel) {
if (_level2 !== 'none') {
proto[_level2] = function () {};
}
}
}
export function getLogger(id) {
return loggers[id] || new Logger(id);
}
export function addAppender(appender) {
if (appenders.push(appender) === 1) {
connectLoggers();
}
}
export function removeAppender(appender) {
appenders = appenders.filter(function (a) {
return a !== appender;
});
}
export function getAppenders() {
return [].concat(appenders);
}
export function clearAppenders() {
appenders = [];
disconnectLoggers();
}
export function addCustomLevel(name, value) {
if (logLevel[name] !== undefined) {
throw Error('Log level "' + name + '" already exists.');
}
if (isNaN(value)) {
throw Error('Value must be a number.');
}
logLevel[name] = value;
if (appenders.length > 0) {
connectLoggers();
} else {
Logger.prototype[name] = function () {};
}
}
export function removeCustomLevel(name) {
if (logLevel[name] === undefined) {
return;
}
if (isStandardLevel(name)) {
throw Error('Built-in log level "' + name + '" cannot be removed.');
}
delete logLevel[name];
delete Logger.prototype[name];
}
export function setLevel(level) {
globalDefaultLevel = level;
for (var key in loggers) {
loggers[key].setLevel(level);
}
}
export function getLevel() {
return globalDefaultLevel;
}
export var Logger = function () {
function Logger(id) {
var cached = loggers[id];
if (cached) {
return cached;
}
loggers[id] = this;
this.id = id;
this.level = globalDefaultLevel;
}
Logger.prototype.debug = function debug(message) {};
Logger.prototype.info = function info(message) {};
Logger.prototype.warn = function warn(message) {};
Logger.prototype.error = function error(message) {};
Logger.prototype.setLevel = function setLevel(level) {
this.level = level;
};
Logger.prototype.isDebugEnabled = function isDebugEnabled() {
return this.level === logLevel.debug;
};
return Logger;
}();