UNPKG

dd-trace

Version:

Datadog APM tracing client for JavaScript

144 lines (110 loc) 3.04 kB
'use strict' const { storage } = require('../../datadog-core') const _default = { debug: msg => console.debug(msg), /* eslint-disable-line no-console */ info: msg => console.info(msg), /* eslint-disable-line no-console */ warn: msg => console.warn(msg), /* eslint-disable-line no-console */ error: msg => console.error(msg) /* eslint-disable-line no-console */ } // based on: https://github.com/trentm/node-bunyan#levels const _logLevels = { 'debug': 20, 'info': 30, 'warn': 40, 'error': 50 } const _defaultLogLevel = 'debug' const _checkLogLevel = (logLevel) => { if (logLevel && typeof logLevel === 'string') { return _logLevels[logLevel.toLowerCase().trim()] || _logLevels[_defaultLogLevel] } return _logLevels[_defaultLogLevel] } const memoize = func => { const cache = {} const memoized = function (key) { if (!cache[key]) { cache[key] = func.apply(this, arguments) } return cache[key] } return memoized } function processMsg (msg) { return typeof msg === 'function' ? msg() : msg } function withNoop (fn) { const store = storage.getStore() storage.enterWith({ noop: true }) fn() storage.enterWith(store) } const log = { _isLogLevelEnabled (level) { return _logLevels[level] >= this._logLevel }, use (logger) { if (logger && logger.debug instanceof Function && logger.error instanceof Function) { this._logger = logger } return this }, toggle (enabled, logLevel, tracer) { this._enabled = enabled this._logLevel = _checkLogLevel(logLevel) this._tracer = tracer return this }, reset () { this._logger = _default this._enabled = false this._deprecate = memoize((code, message) => { withNoop(() => this._logger.error(message)) return this }) this._logLevel = _checkLogLevel() return this }, debug (message) { if (this._enabled && this._isLogLevelEnabled('debug')) { withNoop(() => this._logger.debug(processMsg(message))) } return this }, info (message) { if (!this._logger.info) return this.debug(message) if (this._enabled && this._isLogLevelEnabled('info')) { withNoop(() => this._logger.info(processMsg(message))) } return this }, warn (message) { if (!this._logger.warn) return this.debug(message) if (this._enabled && this._isLogLevelEnabled('warn')) { withNoop(() => this._logger.warn(processMsg(message))) } return this }, error (err) { if (this._enabled && this._isLogLevelEnabled('error')) { if (err instanceof Function) { err = err() } if (typeof err !== 'object' || !err) { err = String(err) } else if (!err.stack) { err = String(err.message || err) } if (typeof err === 'string') { err = new Error(err) } withNoop(() => this._logger.error(err)) } return this }, deprecate (code, message) { return this._deprecate(code, message) } } log.reset() module.exports = log