Created
May 22, 2017 11:10
-
-
Save slonoed/32b40f5d5af2de0e889c169e436d2b80 to your computer and use it in GitHub Desktop.
Simple log system
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* @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