UNPKG

catbee-logger

Version:

Logger service for catbee

214 lines (183 loc) 4.34 kB
/* eslint no-console:0 */ const LoggerBase = require('../lib/base/LoggerBase'); /** * Creates browser logger. * * @param {ServiceLocator} $serviceLocator * @constructor */ class Logger extends LoggerBase { constructor (locator) { super(); /** * Browser logger transports. * * @type {Array} * @private */ this._transports = []; /** * Catbee logger config reference * * @type {Object} * @private */ this._config = locator.resolve('config'); this._config.logger = this._config.logger || {}; this.addEnrichment((log) => { log.from = 'Browser'; }); this.addTransport(Logger._consoleTransport); this._setLevels(this._config.logger.levels); this.debug = this.debug.bind(this); this.trace = this.trace.bind(this); this.info = this.info.bind(this); this.warn = this.warn.bind(this); this.error = this.error.bind(this); this.fatal = this.fatal.bind(this); this.onerror = this.onerror.bind(this); } /** * Add log messages transport. * * @param {function} transport */ addTransport (transport) { if (typeof transport !== 'function') { throw new TypeError('Transport must be a function'); } this._transports.push(transport); } /** * Add log messages transport. * * @param {function} transport */ removeTransport (transport) { const index = this._transports.indexOf(transport); if (index === -1) { this.info('Transport not found. Remove nothing'); return; } this._transports.splice(index, 1); } dropTransports () { this._transports = []; } /** * Window error event handler. * * @param {ErrorEvent} error * @param {String} message * @param {Number} lineno - line number * @param {Number} colno - column number * @param {String} filename - script */ onerror ({ message, filename, lineno, colno, error }) { this._send('error', message, { stack: error.stack, filename: filename, line: `${lineno}:${colno}` }); } /** * Logs trace message. * * @param {string} message Error object or message. * @param {Object|undefined} meta */ trace (message, meta = {}) { if (!this._levels.trace) { return; } this._message('trace', message, meta); } /** * Logs trace message. * @param {string} message Error object or message. * @param {Object|undefined} meta */ debug (message, meta = {}) { if (!this._levels.debug) { return; } this._message('debug', message, meta); } /** * Logs info message. * * @param {string|Object|Error} message Error object or message. * @param {Object|undefined} meta */ info (message, meta = {}) { if (!this._levels.info) { return; } this._message('info', message, meta); } /** * Logs warn message. * * @param {string} message Error object or message. * @param {Object|undefined} meta */ warn (message, meta = {}) { if (!this._levels.warn) { return; } this._message('warn', message, meta); } /** * Logs error message. * * @param {string|Error} message Error object or message. * @param {Object|undefined} meta */ error (message, meta = {}) { if (!this._levels.error) { return; } this._error('error', message, meta); } /** * Logs error message. * @param {string|Error} message Error object or message. * @param {Object|undefined} meta */ fatal (message, meta = {}) { if (!this._levels.fatal) { return; } this._error('fatal', message, meta); } /** * Transport to browser console. * * @param {string} level * @param {Object} log */ static _consoleTransport (level, log) { const map = { trace: 'log', debug: 'log', info: 'info', warn: 'warn', error: 'error', fatal: 'error' }; if (console[map[level]]) { console[map[level]](`[${level.toUpperCase()}]`, log.stack || log.message); } } /** * Entry point for browser logs. * Executes from LoggerBase. * * @param {string} level * @param {Object} log */ log (level, log) { this._transports.forEach((transport) => transport(level, log)); } } module.exports = Logger;