/* @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