UNPKG

loggers

Version:

simple and powerfull loggers

96 lines (81 loc) 2.31 kB
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; }