Create a gist now

Instantly share code, notes, and snippets.

What would you like to do?
Simple log system
/* @flow */
/* eslint-disable no-console */
/*
* Логгер, создается в разных контекстах
* Имеет внутренний стейт, так как должнен быть создан и начать
* работать до запуска основных модулей
*
* Доступные уровни: ALL, WARN, ERROR, SILENT
*
* Пример использования
*
* import log from './log';
*
* log.level(log.ALL); // показыать все логи
* log.info('Some info');
*
* Поддерживает тегироване, позволяющее включить отдельные логи
* и выделить их
*
* log('tag-name').warn('Tagged warning message');
*
* Для тегов можно задать уровень
* log('tag-name').level(log.ERROR);
* log('tag-name').warn('Silent log'); // не выведет ничего
*
* При этом на вывод тегов влияет общий уровень и из двух выбирается тот,
* который дает больше логов, то есть
* log('tag').level(log.SILENT);
* log.level(log.ALL);
* log('tag').info('I see you'); // лог будет показан
*
* log('tag').level(log.ALL);
* log.level(log.SILENT);
* log('tag').info('I see you'); // лог так же будет показан
*
*
* Позволяет повесить обработчик ошибок (полезно, чтоб повесить отправку ошибок на сервер)
* log.onError((e, ...params) => sendAjaxError(e, params));
*/
type Tag = string;
type Params = Array<any>;
type Level = number;
const ALL = 0;
const WARN = 1;
const ERROR = 2;
const SILENT = 3;
let level = process.env.NODE_ENV === 'production' ? SILENT : ALL;
const levels = {};
const errorHandlers = [];
let console = window.console;
if (!console) {
console = {
info() {},
warn() {},
error() {}
};
}
function log(tag : Tag) {
const tagStr = `[${tag}]`;
return {
info: (...params : Params) => {
if (level < WARN || levels[tag] < WARN) {
console.info(tagStr, ...params);
}
},
warn: (...params : Params) => {
if (level < ERROR || levels[tag] < ERROR) {
console.warn(tagStr, ...params);
}
},
error: (err : Error, ...params : Params) => {
callErrorHandlers(err, ...params);
if (level < SILENT || levels[tag] < SILENT) {
console.error(err, tagStr, ...params);
}
},
level: (l : Level) => {
levels[tag] = l;
}
};
}
function callErrorHandlers(err, ...params : Params) {
for (let i = 0, l = errorHandlers.length; i < l; i++) {
errorHandlers[i](err, ...params);
}
}
log.info = (...params : Params) => {
if (level < WARN) {
console.info(...params);
}
};
log.warn = (...params : Params) => {
if (level < ERROR) {
console.warn(...params);
}
};
log.error = (err, ...params : Params) => {
callErrorHandlers(err, ...params);
if (level < SILENT) {
console.error(err, ...params);
}
};
log.ALL = ALL;
log.WARN = WARN;
log.ERROR = ERROR;
log.SILENT = SILENT;
log.level = (l) => {
level = l;
};
log.onError = (cb) => {
errorHandlers.push(cb);
};
module.exports = log;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment