Skip to content

Instantly share code, notes, and snippets.

@max-lt
Last active November 17, 2022 12:08
Show Gist options
  • Save max-lt/074b3831216237089100c193048123af to your computer and use it in GitHub Desktop.
Save max-lt/074b3831216237089100c193048123af to your computer and use it in GitHub Desktop.
enum LEVELS {
trace,
debug,
info,
warn,
error
}
type Levels = keyof typeof LEVELS;
interface Logger extends Pick<Console, Levels> {
getLogger: (name: string, level?: LEVELS) => Logger;
}
const storage = (typeof window !== 'undefined' && window.sessionStorage) || null;
function createLogger(name: string, level: LEVELS = LEVELS.warn): Logger {
let lvl = level;
if (storage) {
const level = storage.getItem(`loglevel:${name}`) as Levels | null;
if (level) {
lvl = LEVELS[level];
} else {
storage.setItem(`loglevel:${name}`, 'warn');
}
}
return new Proxy(console as any as Logger, {
get(target, prop) {
switch (prop) {
case 'getLogger':
return (name: string, level?: Levels) => createLogger(name, level && LEVELS[level]);
case 'trace':
case 'debug':
case 'info':
case 'warn':
case 'error':
if (LEVELS[prop] < lvl) {
return () => {};
}
return target[prop];
default:
return undefined;
}
}
});
}
export const logger = createLogger('main');
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment