@danielkalen/simplybind
Version:
Magically simple, framework-less one-way/two-way data binding for frontend/backend in ~5kb.
112 lines (85 loc) • 1.79 kB
JavaScript
export const logLevel = {
none: 0,
error: 1,
warn: 2,
info: 3,
debug: 4
};
let loggers = {};
let currentLevel = logLevel.none;
let appenders = [];
let slice = Array.prototype.slice;
let loggerConstructionKey = {};
function log(logger, level, args) {
let i = appenders.length;
let current;
args = slice.call(args);
args.unshift(logger);
while (i--) {
current = appenders[i];
current[level].apply(current, args);
}
}
function debug() {
if (currentLevel < 4) {
return;
}
log(this, 'debug', arguments);
}
function info() {
if (currentLevel < 3) {
return;
}
log(this, 'info', arguments);
}
function warn() {
if (currentLevel < 2) {
return;
}
log(this, 'warn', arguments);
}
function error() {
if (currentLevel < 1) {
return;
}
log(this, 'error', arguments);
}
function connectLogger(logger) {
logger.debug = debug;
logger.info = info;
logger.warn = warn;
logger.error = error;
}
function createLogger(id) {
let logger = new Logger(id, loggerConstructionKey);
if (appenders.length) {
connectLogger(logger);
}
return logger;
}
export function getLogger(id) {
return loggers[id] || (loggers[id] = createLogger(id));
}
export function addAppender(appender) {
appenders.push(appender);
if (appenders.length === 1) {
for (let key in loggers) {
connectLogger(loggers[key]);
}
}
}
export function setLevel(level) {
currentLevel = level;
}
export let Logger = class Logger {
constructor(id, key) {
if (key !== loggerConstructionKey) {
throw new Error('Cannot instantiate "Logger". Use "getLogger" instead.');
}
this.id = id;
}
debug(message, ...rest) {}
info(message, ...rest) {}
warn(message, ...rest) {}
error(message, ...rest) {}
};