Skip to content

Instantly share code, notes, and snippets.

@AntonLydike
Last active November 29, 2016 23:20
Show Gist options
  • Save AntonLydike/a4a41e5b5b0041d8fbf494ba605cafe0 to your computer and use it in GitHub Desktop.
Save AntonLydike/a4a41e5b5b0041d8fbf494ba605cafe0 to your computer and use it in GitHub Desktop.
Simple, configurable project logger
((loggers = {}) => {
if (loggers && loggers.__allow === undefined) loggers.__allow = "warn error";
if (loggers && loggers.__supress === undefined) loggers.__supress = "";
let disabled = false,
log = (token, method, ...a) => {
if (!disabled && loggers !== false && (loggers.__supress.indexOf(method) == -1) && ((loggers.__allow.indexOf(method) > -1) || loggers[token] !== false)) console[method].apply(console, a)
};
function getLogger (token) {
let llog = log.bind({}, token);
let logger = (...a) => {
llog('log',...a);
}
logger.error = (...a) => {
llog('error', ...a)
}
logger.warn = (...a) => {
llog('warn', ...a)
}
return logger;
}
Logger = getLogger;
Logger.set = (token, val) => {
if (token === false) return disabled = true;
disabled = false;
loggers[token] = val === undefined ? false : val;
}
})(loggers)
"use strict";(function(){var b=0<arguments.length&&void 0!==arguments[0]?arguments[0]:{};b&&b.__allow===void 0&&(b.__allow="warn error"),b&&b.__allow===void 0&&(b.__supress="");var c=!1,d=function d(e,f){for(var _len=arguments.length,g=Array(2<_len?_len-2:0),_key=2;_key<_len;_key++)g[_key-2]=arguments[_key];!c&&!1!==b&&-1==b.__supress.indexOf(f)&&(-1<b.__allow.indexOf(f)||!1!==b[e])&&console[f].apply(console,g)};Logger=function Logger(f){var g=function g(){for(var _len2=arguments.length,h=Array(_len2),_key2=0;_key2<_len2;_key2++)h[_key2]=arguments[_key2];d.apply(void 0,[f,"log"].concat(h))};return g.error=function(){for(var _len3=arguments.length,h=Array(_len3),_key3=0;_key3<_len3;_key3++)h[_key3]=arguments[_key3];d.apply(void 0,[f,"error"].concat(h))},g.warn=function(){for(var _len4=arguments.length,h=Array(_len4),_key4=0;_key4<_len4;_key4++)h[_key4]=arguments[_key4];d.apply(void 0,[f,"warn"].concat(h))},g},Logger.set=function(e){var f=1<arguments.length&&void 0!==arguments[1]&&arguments[1];return!1===e?c=!0:void(c=!1,b[e]=f)}})(loggers);

Logger.js

Because there are not enough other logger libraries out there ;D (and because I got a little distracted...)

startup.js (first file or whatever) (file who gets executet before everything else)

// general example:
loggers = {
	/// BLOCK BY NAME
	rendering: true,  // allow rendering token (can be omitted, is true by default)
	routing: false,   // false = blocked

	/// ALLOW BY METHOD (overwrites token block)
	// what can log even if it's name is blocked
	// "error warn" by default
	__allow: "error warn",

	/// BLOCK BY METHOD (overwrites allow)
	// supress all specified methods
	__supress: "log error warn",
}

//// examples:
// block all logs
loggers = {
	__supress: 'log'
}

// "rendering" is nothing allowed except 'error'
// no one is allowed to log
// everyone except "rendering" can warn
// log: no one
// warn: everyone except rendering
// error: everyone
loggers = {
	rendering: 	false,
	__allow: 		'error',
	__supress: 	'log'
}

// or disable everything:
loggers = false;

Logger.js

((loggers = {}) => {

	if (loggers && loggers.__allow   === undefined) loggers.__allow   = "warn error";
	if (loggers && loggers.__supress === undefined) loggers.__supress = "";
	
	let disabled = false,
			log = (token, method, ...a) => {
				if (!disabled && loggers !== false && (loggers.__supress.indexOf(method) == -1) && ((loggers.__allow.indexOf(method) > -1) || loggers[token] !== false)) console[method].apply(console, a)
			}; 

	function getLogger (token) {
		let llog = log.bind({}, token);

		let logger = (...a) => {
			llog('log',...a);
		}

		logger.error = (...a) => {
			llog('error', ...a)
		}
		logger.warn = (...a) => {
			llog('warn', ...a)
		}
		return logger;
	}

	Logger = getLogger;
	Logger.set = (token, val) => {
		if (token === false) return disabled = true;

		disabled = false;
    
		loggers[token] = val === undefined ? false : val;
	}

})(loggers)

Usage:

// router.js (for example)

let log = Logger('router');

log("I'm just a standard", console, "log", ['a', 'b', 1, 2]);

log.warn("I'm a warning!");

log.error("I'm an error")

changing logging rules on the fly

I don't know why, but why not?

Logger.set(false) // disable logging

Logger.set('someToken1', false) // enable logging again and set some token to false in the logger object
Logger.set('someToken2')        // same thing... false is default
Logger.set('__allow','error')   // change __warn

minified version: (BABEL'ED)

"use strict";(function(){var b=0<arguments.length&&void 0!==arguments[0]?arguments[0]:{};b&&b.__allow===void 0&&(b.__allow="warn error"),b&&b.__allow===void 0&&(b.__supress="");var c=!1,d=function d(e,f){for(var _len=arguments.length,g=Array(2<_len?_len-2:0),_key=2;_key<_len;_key++)g[_key-2]=arguments[_key];!c&&!1!==b&&-1==b.__supress.indexOf(f)&&(-1<b.__allow.indexOf(f)||!1!==b[e])&&console[f].apply(console,g)};Logger=function Logger(f){var g=function g(){for(var _len2=arguments.length,h=Array(_len2),_key2=0;_key2<_len2;_key2++)h[_key2]=arguments[_key2];d.apply(void 0,[f,"log"].concat(h))};return g.error=function(){for(var _len3=arguments.length,h=Array(_len3),_key3=0;_key3<_len3;_key3++)h[_key3]=arguments[_key3];d.apply(void 0,[f,"error"].concat(h))},g.warn=function(){for(var _len4=arguments.length,h=Array(_len4),_key4=0;_key4<_len4;_key4++)h[_key4]=arguments[_key4];d.apply(void 0,[f,"warn"].concat(h))},g},Logger.set=function(e){var f=1<arguments.length&&void 0!==arguments[1]&&arguments[1];return!1===e?c=!0:void(c=!1,b[e]=f)}})(loggers);

fun fact: babel had problems with function.prototype.bind but I am no expert on babel either^^ (simply worked around using bind())

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment