loggers
Version:
simple and powerfull loggers
96 lines (81 loc) • 2.31 kB
JavaScript
module.exports = configure;
var _ = require("lodash"),
u = configure.u = require("./utils"),
loggerProxyHandler = {
apply(logger, $this, args) {
return logger("def", ...args);
},
get(logger, prop) {
if(prop === "config") return logger.config;
if(prop === "u") return u;
return logger.bind(null, prop);
}
};
function configure(config) {
// defaults
if(!_.isPlainObject(config)) {
let tmpl;
if(_.isString(config)) {
tmpl = config;
} else {
tmpl = "${logger}.${level}: ${message}\n"
}
config = {
def: {
def: u.tmplout(tmpl),
err: u.tmplerr(tmpl)
}
}
}
var cache = {};
return getLogger.bind(null, cache, config);
}
function getLogger(cache, config, loggerName) {
return loggerName in cache ?
cache[loggerName] :
cache[loggerName] = newLogger(config, loggerName);
}
function newLogger(config, loggerName) {
let logger = log.bind(null, config, loggerName),
loggerProxy = new Proxy(logger, loggerProxyHandler);
logger.config = config;
return loggerProxy;
}
function log(config, loggerName, levelName, ...args) {
let handlers = _.get(config, [loggerName, levelName]) ||
_.get(config, [loggerName, "def"]) ||
_.get(config, ["def", levelName]) ||
_.get(config, ["def", "def"]),
record = new Record(...arguments);
execHandler(record, handlers);
return record;
}
class Record {
// the same arguments as in the "log" function
constructor(config, loggerName, levelName, ...args) {
this.logger = loggerName;
this.level = levelName;
this.config = config;
this.args = args;
this.journal = {};
};
get u() {
return u;
}
get filename() {
}
}
function execHandler(record, handler) {
if(_.isArray(handler)) {
handler.some(execHandler.bind(null, record));
}
if(_.isFunction(handler)) {
try {
handler(record);
} catch(err) {
record.cause = err;
return true;
}
}
return false;
}