|
|
var util = require('util') var _ = require('lodash')
var loggerInstance
var defaultProvider = { log: console.log, debug: console.log, // use .log(); since console does not have .debug()
info: console.info, warn: console.warn, error: console.error }
// log level 'weight'
var LEVELS = { debug: 10, info: 20, warn: 30, error: 50, silent: 80 }
module.exports = { // singleton
getInstance: function() { if (!loggerInstance) { loggerInstance = new Logger() }
return loggerInstance }, getArrow: getArrow }
function Logger() { var logLevel var provider
var api = { log: log, debug: debug, info: info, warn: warn, error: error, setLevel: function(v) { if (isValidLevel(v)) { logLevel = v } }, setProvider: function(fn) { if (fn && isValidProvider(fn)) { provider = fn(defaultProvider) } } }
init()
return api
function init() { api.setLevel('info') api.setProvider(function() { return defaultProvider }) }
// log will log messages, regardless of logLevels
function log() { provider.log(_interpolate.apply(null, arguments)) }
function debug() { if (_showLevel('debug')) { provider.debug(_interpolate.apply(null, arguments)) } }
function info() { if (_showLevel('info')) { provider.info(_interpolate.apply(null, arguments)) } }
function warn() { if (_showLevel('warn')) { provider.warn(_interpolate.apply(null, arguments)) } }
function error() { if (_showLevel('error')) { provider.error(_interpolate.apply(null, arguments)) } }
/** * Decide to log or not to log, based on the log levels 'weight' * @param {String} showLevel [debug, info, warn, error, silent] * @return {Boolean} */ function _showLevel(showLevel) { var result = false var currentLogLevel = LEVELS[logLevel]
if (currentLogLevel && currentLogLevel <= LEVELS[showLevel]) { result = true }
return result }
// make sure logged messages and its data are return interpolated
// make it possible for additional log data, such date/time or custom prefix.
function _interpolate() { var fn = _.spread(util.format) var result = fn(_.slice(arguments))
return result }
function isValidProvider(fnProvider) { var result = true
if (fnProvider && !_.isFunction(fnProvider)) { throw new Error('[HPM] Log provider config error. Expecting a function.') }
return result }
function isValidLevel(levelName) { var validLevels = _.keys(LEVELS) var isValid = _.includes(validLevels, levelName)
if (!isValid) { throw new Error('[HPM] Log level error. Invalid logLevel.') }
return isValid } }
/** * -> normal proxy * => router * ~> pathRewrite * ≈> router + pathRewrite * * @param {String} originalPath * @param {String} newPath * @param {String} originalTarget * @param {String} newTarget * @return {String} */ function getArrow(originalPath, newPath, originalTarget, newTarget) { var arrow = ['>'] var isNewTarget = originalTarget !== newTarget // router
var isNewPath = originalPath !== newPath // pathRewrite
if (isNewPath && !isNewTarget) { arrow.unshift('~') } else if (!isNewPath && isNewTarget) { arrow.unshift('=') } else if (isNewPath && isNewTarget) { arrow.unshift('≈') } else { arrow.unshift('-') }
return arrow.join('') }
|