UNPKG

39.4 kBSource Map (JSON)View Raw
1{"version":3,"file":"logger.js","sources":["../src/logger.js"],"sourcesContent":["import _ from 'lodash';\nimport semver from 'semver';\nimport net from 'net';\nimport tls from 'tls';\nimport urlUtil from 'url';\nimport { Writable } from 'stream';\nimport codependency from 'codependency';\nimport reconnectCore from 'reconnect-core';\nimport * as defaults from './defaults';\nimport * as levelUtil from './levels';\nimport text from './text';\nimport build from './serialize';\nimport {\n BadOptionsError,\n LogentriesError\n} from './error';\nimport RingBuffer from './ringbuffer';\nimport BunyanStream from './bunyanstream';\n\n// patterns\nconst newline = /\\n/g;\nconst tokenPattern = /[a-f\\d]{8}-([a-f\\d]{4}-){3}[a-f\\d]{12}/;\n\n/**\n * Append log string to provided token.\n *\n * @param log\n * @param token\n */\nconst finalizeLogString = (log, token) =>\n `${token} ${log.toString().replace(newline, '\\u2028')}\\n`;\n\n/**\n * Get console method corresponds to lvl\n *\n * @param lvl\n * @returns {*}\n */\nconst getConsoleMethod = lvl => {\n if (lvl > 3) {\n return 'error';\n } else if (lvl === 3) {\n return 'warn';\n }\n return 'log';\n};\n\n/**\n * Get a new prop name that does not exist in the log.\n *\n * @param log\n * @param prop\n * @returns safeProp\n */\nconst getSafeProp = (log, prop) => {\n let safeProp = prop;\n while (safeProp in log) {\n safeProp = `_${prop}`;\n }\n return safeProp;\n};\n\nconst requirePeer = codependency.register(module);\n\n\n/**\n * Logger class that handles parsing of logs and sending logs to Logentries.\n */\nclass Logger extends Writable {\n constructor(opts) {\n super({\n objectMode: true\n });\n\n // Sanity checks\n if (_.isUndefined(opts)) {\n throw new BadOptionsError(opts, text.noOptions());\n }\n\n if (!_.isObject(opts)) {\n throw new BadOptionsError(opts, text.optionsNotObj(typeof opts));\n }\n\n if (_.isUndefined(opts.token)) {\n throw new BadOptionsError(opts, text.noToken());\n }\n\n if (!_.isString(opts.token) || !tokenPattern.test(opts.token)) {\n throw new BadOptionsError(opts, text.invalidToken(opts.token));\n }\n\n // Log method aliases\n this.levels = levelUtil.normalize(opts);\n\n for (const lvlName of this.levels) {\n if (lvlName in this) {\n throw new BadOptionsError(opts, text.levelConflict(lvlName));\n }\n\n Object.defineProperty(this, lvlName, {\n enumerable: true,\n writable: false,\n value() {\n this.log.apply(this, [lvlName, ...arguments]);\n }\n });\n }\n\n // boolean options\n this.secure = opts.secure === undefined ? defaults.secure : opts.secure;\n this.debugEnabled = opts.debug === undefined ? defaults.debug : opts.debug;\n this.json = opts.json;\n this.flatten = opts.flatten;\n this.flattenArrays = 'flattenArrays' in opts ? opts.flattenArrays : opts.flatten;\n this.console = opts.console;\n this.withLevel = 'withLevel' in opts ? opts.withLevel : true;\n this.withStack = opts.withStack;\n this.timestamp = opts.timestamp || false;\n\n // string or numeric options\n this.bufferSize = opts.bufferSize || defaults.bufferSize;\n this.port = opts.port || (this.secure ? defaults.portSecure : defaults.port);\n this.host = opts.host;\n this.minLevel = opts.minLevel;\n this.replacer = opts.replacer;\n this.inactivityTimeout = opts.inactivityTimeout || defaults.inactivityTimeout;\n this.token = opts.token;\n this.reconnectInitialDelay = opts.reconnectInitialDelay || defaults.reconnectInitialDelay;\n this.reconnectMaxDelay = opts.reconnectMaxDelay || defaults.reconnectMaxDelay;\n this.reconnectBackoffStrategy =\n opts.reconnectBackoffStrategy || defaults.reconnectBackoffStrategy;\n\n if (!this.debugEnabled) {\n // if there is no debug set, empty logger should be used\n this.debugLogger = {\n log: () => {\n }\n };\n } else {\n this.debugLogger =\n (opts.debugLogger && opts.debugLogger.log) ? opts.debugLogger : defaults.debugLogger;\n }\n\n const isSecure = this.secure;\n this.ringBuffer = new RingBuffer(this.bufferSize);\n this.reconnect = reconnectCore(function initialize() {\n let connection;\n const args = [].slice.call(arguments);\n if (isSecure) {\n connection = tls.connect.apply(tls, args, () => {\n if (!connection.authorized) {\n const errMsg = connection.authorizationError;\n this.emit(new LogentriesError(text.authError(errMsg)));\n } else if (tls && tls.CleartextStream && connection instanceof tls.CleartextStream) {\n this.emit('connect');\n }\n });\n } else {\n connection = net.connect.apply(null, args);\n }\n connection.setTimeout(opts.inactivityTimeout || defaults.inactivityTimeout);\n return connection;\n });\n\n // RingBuffer emits buffer shift event, meaning we are discarding some data!\n this.ringBuffer.on('buffer shift', () => {\n this.debugLogger.log('Buffer is full, will be shifting records until buffer is drained.');\n });\n\n this.on('buffer drain', () => {\n this.debugLogger.log('RingBuffer drained.');\n });\n }\n\n /**\n * Override Writable _write method.\n * Get the connection promise .then write the next log on the ringBuffer\n * to Logentries connection when its available\n */\n _write(ch, enc, cb) {\n this.connection.then(conn => {\n const record = this.ringBuffer.read();\n if (record) {\n // we are checking the buffer state here just after conn.write()\n // to make sure the last event is sent to socket.\n if (this.ringBuffer.isEmpty()) {\n conn.write(record, () => {\n process.nextTick(() => {\n this.emit('buffer drain');\n // this event is DEPRECATED - will be removed in next major release.\n // new users should use 'buffer drain' event instead.\n this.emit('connection drain');\n });\n });\n } else {\n conn.write(record);\n }\n } else {\n this.debugLogger.log('This should not happen. Read from ringBuffer returned null.');\n }\n cb();\n }).catch(err => {\n this.emit('error', err);\n this.debugLogger.log(`Error: ${err}`);\n cb();\n });\n }\n\n setDefaultEncoding() { /* no. */\n }\n\n /**\n * Finalize the log and write() to Logger stream\n * @param lvl\n * @param log\n */\n log(lvl, log) {\n let modifiedLevel = lvl;\n let modifiedLog = log;\n // lvl is optional\n if (modifiedLog === undefined) {\n modifiedLog = modifiedLevel;\n modifiedLevel = null;\n }\n\n let lvlName;\n\n if (modifiedLevel || modifiedLevel === 0) {\n [modifiedLevel, lvlName] = this.toLevel(modifiedLevel);\n\n // If lvl is present, it must be recognized\n if (!modifiedLevel && modifiedLevel !== 0) {\n this.emit('error', new LogentriesError(text.unknownLevel(modifiedLevel)));\n return;\n }\n\n // If lvl is below minLevel, it is dismissed\n if (modifiedLevel < this.minLevel) {\n return;\n }\n }\n\n // If log is an array, it is treated as a collection of log events\n if (_.isArray(modifiedLog)) {\n if (modifiedLog.length) {\n for (const $modifiedLog of modifiedLog) this.log(modifiedLevel, $modifiedLog);\n } else {\n this.emit('error', new LogentriesError(text.noLogMessage()));\n }\n return;\n }\n\n // If log is an object, it is serialized to string and may be augmented\n // with timestamp and level. For strings, these may be prepended.\n if (_.isObject(modifiedLog)) {\n let safeTime;\n let safeLevel;\n\n if (this.timestamp) {\n safeTime = getSafeProp(modifiedLog, 'time');\n modifiedLog[safeTime] = new Date();\n }\n\n if (this.withLevel && lvlName) {\n safeLevel = getSafeProp(modifiedLog, 'level');\n modifiedLog[safeLevel] = lvlName;\n }\n\n modifiedLog = this._serialize(modifiedLog);\n\n if (!modifiedLog) {\n this.emit('error', new LogentriesError(text.serializedEmpty()));\n return;\n }\n\n if (this.console) {\n console[getConsoleMethod(modifiedLevel)](JSON.parse(modifiedLog));\n }\n\n if (safeTime) delete modifiedLog[safeTime];\n if (safeLevel) delete modifiedLog[safeLevel];\n } else {\n if (_.isEmpty(modifiedLog)) {\n this.emit('error', new LogentriesError(text.noLogMessage()));\n return;\n }\n\n modifiedLog = [modifiedLog.toString()];\n\n if (this.withLevel && lvlName) {\n modifiedLog.unshift(lvlName);\n }\n\n if (this.timestamp) {\n modifiedLog.unshift((new Date()).toISOString());\n }\n\n modifiedLog = modifiedLog.join(' ');\n\n if (this.console) {\n console[getConsoleMethod(modifiedLevel)](modifiedLog);\n }\n }\n\n this.emit('log', modifiedLog);\n\n // if RingBuffer.write returns false, don't create any other write request for\n // the writable stream to avoid memory leak this means there are already 'bufferSize'\n // of write events in the writable stream and that's what we want.\n if (this.ringBuffer.write(finalizeLogString(modifiedLog, this.token))) {\n this.write();\n }\n }\n\n /**\n * Close connection via reconnection\n */\n closeConnection() {\n this.debugLogger.log('Closing retry mechanism along with its connection.');\n if (!this.reconnection) {\n this.debugLogger.log('No reconnection instance found. Returning.');\n return;\n }\n // this makes sure retry mechanism and connection will be closed.\n this.reconnection.disconnect();\n }\n\n // Private methods\n toLevel(val) {\n let num;\n\n if (levelUtil.isNumberValid(val)) {\n num = parseInt(val, 10); // -0\n } else {\n num = this.levels.indexOf(val);\n }\n\n const name = this.levels[num];\n\n return name ? [num, name] : [];\n }\n\n get reconnect() {\n return this._reconnect;\n }\n\n set reconnect(func) {\n this._reconnect = func;\n }\n\n get connection() {\n // The $connection property is a promise. On error, manual close, or\n // inactivityTimeout, it deletes itself.\n if (this._connection) {\n return this._connection;\n }\n\n this.debugLogger.log('No connection exists. Creating a new one.');\n // clear the state of previous reconnection and create a new one with a new connection promise.\n if (this.reconnection) {\n // destroy previous reconnection instance if it exists.\n this.reconnection.disconnect();\n this.reconnection = null;\n }\n\n this.reconnection = this.reconnect({\n // all options are optional\n initialDelay: this.reconnectInitialDelay,\n maxDelay: this.reconnectMaxDelay,\n strategy: this.reconnectBackoffStrategy,\n failAfter: Infinity,\n randomisationFactor: 0,\n immediate: false\n });\n\n this.connection = new Promise((resolve) => {\n const connOpts = {\n host: this.host,\n port: this.port\n };\n\n // reconnection listeners\n this.reconnection.on('connect', (connection) => {\n this.debugLogger.log('Connected');\n this.emit('connected');\n\n // connection listeners\n connection.on('timeout', () => {\n // we owe a lot to inactivity timeout handling with regards to clearing\n // unwanted opened connections hanging around.\n this.debugLogger.log(\n `Socket was inactive for ${this.inactivityTimeout / 1000} seconds. Destroying.`);\n this.closeConnection();\n this.connection = null;\n this.emit('timed out');\n });\n resolve(connection);\n });\n\n this.reconnection.on('reconnect', (n, delay) => {\n if (n > 0) {\n this.debugLogger.log(`Trying to reconnect. Times: ${n} , previous delay: ${delay}`);\n }\n });\n\n this.reconnection.once('disconnect', () => {\n this.debugLogger.log('Socket was disconnected');\n this.connection = null;\n this.emit('disconnected');\n });\n\n this.reconnection.on('error', (err) => {\n this.debugLogger.log(`Error occurred during connection: ${err}`);\n });\n\n // now try to connect\n this.reconnection.connect(connOpts);\n });\n return this.connection;\n }\n\n set connection(obj) {\n this._connection = obj;\n }\n\n get reconnection() {\n return this._reconnection;\n }\n\n set reconnection(func) {\n this._reconnection = func;\n }\n\n get debugEnabled() {\n return this._debugEnabled;\n }\n\n set debugEnabled(val) {\n this._debugEnabled = !!val;\n }\n\n get debugLogger() {\n return this._debugLogger;\n }\n\n set debugLogger(func) {\n this._debugLogger = func;\n }\n\n get ringBuffer() {\n return this._ringBuffer;\n }\n\n set ringBuffer(obj) {\n this._ringBuffer = obj;\n }\n\n get secure() {\n return this._secure;\n }\n\n set secure(val) {\n this._secure = !!val;\n }\n\n get token() {\n return this._token;\n }\n\n set token(val) {\n this._token = val;\n }\n\n get bufferSize() {\n return this._bufferSize;\n }\n\n set bufferSize(val) {\n this._bufferSize = val;\n }\n\n get console() {\n return this._console;\n }\n\n set console(val) {\n this._console = !!val;\n }\n\n get serialize() {\n return this._serialize;\n }\n\n set serialize(func) {\n this._serialize = func;\n }\n\n get flatten() {\n return this._flatten;\n }\n\n set flatten(val) {\n this._flatten = !!val;\n this.serialize = build(this);\n }\n\n get flattenArrays() {\n return this._flattenArrays;\n }\n\n set flattenArrays(val) {\n this._flattenArrays = !!val;\n this.serialize = build(this);\n }\n\n get host() {\n return this._host;\n }\n\n set host(val) {\n if (!_.isString(val) || !val.length) {\n this._host = defaults.host;\n return;\n }\n\n const host = val.replace(/^https?:\\/\\//, '');\n\n const url = urlUtil.parse(`http://${host}`);\n\n this._host = url.hostname || defaults.host;\n\n if (url.port) this.port = url.port;\n }\n\n get json() {\n return this._json;\n }\n\n set json(val) {\n this._json = val;\n }\n\n get reconnectMaxDelay() {\n return this._reconnectMaxDelay;\n }\n\n set reconnectMaxDelay(val) {\n this._reconnectMaxDelay = val;\n }\n\n get reconnectInitialDelay() {\n return this._reconnectInitialDelay;\n }\n\n set reconnectInitialDelay(val) {\n this._reconnectInitialDelay = val;\n }\n\n get reconnectBackoffStrategy() {\n return this._reconnectBackoffStrategy;\n }\n\n set reconnectBackoffStrategy(val) {\n this._reconnectBackoffStrategy = val;\n }\n\n get minLevel() {\n return this._minLevel;\n }\n\n set minLevel(val) {\n const [num] = this.toLevel(val);\n\n this._minLevel = _.isNumber(num) ? num : 0;\n }\n\n get port() {\n return this._port;\n }\n\n set port(val) {\n const port = parseFloat(val);\n if (Number.isInteger(port) && _.inRange(port, 65536)) this._port = port;\n }\n\n get replacer() {\n return this._replacer;\n }\n\n set replacer(val) {\n this._replacer = _.isFunction(val) ? val : undefined;\n this.serialize = build(this);\n }\n\n get inactivityTimeout() {\n return this._inactivityTimeout;\n }\n\n set inactivityTimeout(val) {\n if (Number.isInteger(val) && val >= 0) {\n this._inactivityTimeout = parseInt(val, 10);\n }\n\n if (!_.isNumber(this._inactivityTimeout)) {\n this._inactivityTimeout = defaults.inactivityTimeout;\n }\n }\n\n get timestamp() {\n return this._timestamp;\n }\n\n set timestamp(val) {\n this._timestamp = !!val;\n }\n\n get withLevel() {\n return this._withLevel;\n }\n\n set withLevel(val) {\n this._withLevel = !!val;\n }\n\n get withStack() {\n return this._withStack;\n }\n\n set withStack(val) {\n this._withStack = !!val;\n this.serialize = build(this);\n }\n\n get levels() {\n return this._levels && this._levels.slice();\n }\n\n set levels(val) {\n this._levels = val;\n }\n\n // Deprecated (to support migrants from le_node)\n level(name) {\n console.warn(text.deprecatedLevelMethod());\n if (~this.levels.indexOf(name)) this.minLevel = name;\n }\n\n // static methods\n static winston() {\n console.warn(text.deprecatedWinstonMethod());\n }\n\n /**\n * Prepare the winston transport\n * @param winston\n */\n static provisionWinston(winston) {\n if (winston.transports.Logentries) return;\n\n const Transport = winston.Transport;\n\n class LogentriesTransport extends Transport {\n constructor(opts) {\n super(opts);\n this.json = opts.json;\n\n const transportOpts = _.clone(opts || {});\n\n transportOpts.minLevel =\n transportOpts.minLevel || transportOpts.level || this.tempLevel || 0;\n\n transportOpts.levels = transportOpts.levels || winston.levels;\n if (semver.satisfies(winston.version, '>=2.0.0')) {\n // Winston and Logengries levels are reversed\n // ('error' level is 0 for Winston and 5 for Logentries)\n // If the user provides custom levels we assue they are\n // using winston standard\n const levels = transportOpts.levels;\n const values = _.values(levels).reverse();\n transportOpts.levels = {};\n _.keys(levels).forEach((k, i) => {\n transportOpts.levels[k] = values[i];\n });\n }\n\n this.tempLevel = null;\n this.logger = new Logger(transportOpts);\n this.logger.on('error', err => this.emit(err));\n }\n\n log(lvl, msg, meta, cb) {\n if (this.json) {\n const message = {\n message: msg\n };\n if (!_.isEmpty(meta)) {\n if (_.isObject(meta)) {\n _.defaults(message, meta);\n } else {\n message.meta = meta;\n }\n }\n\n this.logger.log(lvl, message);\n } else {\n let message = msg;\n if (!_.isEmpty(meta)) {\n if (_.isString(message)) {\n message += ` ${this.logger.serialize(meta)}`;\n } else if (_.isObject(message)) {\n message[getSafeProp(message, 'meta')] = meta;\n }\n }\n\n this.logger.log(lvl, message);\n }\n\n setImmediate(cb.bind(null, null, true));\n }\n\n get name() {\n return 'logentries';\n }\n\n get tempLevel() {\n return this._tempLevel;\n }\n\n set tempLevel(val) {\n this._tempLevel = val;\n }\n\n get logger() {\n return this._logger;\n }\n\n set logger(obj) {\n this._logger = obj;\n }\n\n get level() {\n const [, lvlName] =\n this.logger.toLevel(this.logger.minLevel);\n return lvlName;\n }\n\n set level(val) {\n if (!this.logger) {\n this.tempLevel = val;\n } else {\n this.logger.minLevel = val;\n }\n }\n\n get levels() {\n return this.logger.levels.reduce((acc, lvlName, lvlNum) => {\n const newAcc = acc;\n newAcc[lvlName] = lvlNum;\n return newAcc;\n }, {});\n }\n }\n\n /* eslint no-param-reassign: [\"error\", { \"props\": false }] */\n winston.transports.Logentries = LogentriesTransport;\n }\n\n /**\n * Prepare a BunyanStream.\n * @param opts\n * @returns {{level: *, name: string, stream: BunyanStream, type: string}}\n */\n static bunyanStream(opts) {\n const stream = new BunyanStream(opts);\n const [, level] = stream.logger.toLevel(stream.logger.minLevel);\n const type = 'raw';\n const name = 'logentries';\n\n // Defer to Bunyan’s handling of minLevel\n stream.logger.minLevel = 0;\n\n return { level, name, stream, type };\n }\n}\n\n// provision winston\nconst winston = requirePeer('winston', { optional: true });\n\nif (winston) Logger.provisionWinston(winston);\n\n// Provision too the winston static versions for testing/development purposes\nconst winston1 = requirePeer('winston1', { optional: true });\nconst winston2 = requirePeer('winston2x', { optional: true });\n\nif (winston1) Logger.provisionWinston(winston1);\nif (winston2) Logger.provisionWinston(winston2);\n\n// exposed Logger events\nconst errorEvent = 'error';\nconst logEvent = 'log';\nconst connectedEvent = 'connected';\nconst disconnectedEvent = 'disconnected';\nconst timeoutEvent = 'timed out';\nconst drainWritableEvent = 'drain';\nconst finishWritableEvent = 'finish';\nconst pipeWritableEvent = 'pipe';\nconst unpipeWritableEvent = 'unpipe';\nconst bufferDrainEvent = 'buffer drain';\n\nexport {\n Logger as default,\n errorEvent,\n logEvent,\n connectedEvent,\n disconnectedEvent,\n timeoutEvent,\n drainWritableEvent,\n finishWritableEvent,\n pipeWritableEvent,\n unpipeWritableEvent,\n bufferDrainEvent\n};\n"],"names":["default","bufferDrainEvent","unpipeWritableEvent","pipeWritableEvent","finishWritableEvent","drainWritableEvent","timeoutEvent","disconnectedEvent","connectedEvent","isUndefined","errorEvent","logEvent","Logger","winston2","Transport","version","_reconnect","provisionWinston","winston1","message","reconnectInitialDelay","length","noOptions","LogentriesTransport","transportOpts","level","clone","optional","writable","type","stream","levelConflict","newAcc","parseInt","values","lvlNum","_debugLogger","acc","read","reduce","replace","safeProp","_logger","requirePeer","_tempLevel","isString","url","levels","process","bind","tokenPattern","console","setTimeout","toLevel","cb","tempLevel","msg","forEach","meta","i","logger","k","reverse","keys","satisfies","timestamp","func","Logentries","transports","authorized","winston","deprecatedWinstonMethod","_levels","_withStack","reconnectBackoffStrategy","inRange","warn","_timestamp","_withLevel","json","minLevel","_inactivityTimeout","_replacer","isFunction","parseFloat","indexOf","_port","isNumber","_minLevel","_reconnectBackoffStrategy","_reconnectMaxDelay","_json","_reconnectInitialDelay","inactivityTimeout","join","getSafeProp","safeTime","hostname","_host","parse","maxDelay","_flattenArrays","serialize","_flatten","_console","_bufferSize","_token","_secure","_ringBuffer","strategy","call","num","authorizationError","delay","reconnect","_debugEnabled","obj","_reconnection","n","once","closeConnection","connOpts","immediate","resolve","randomisationFactor","ringBuffer","Infinity","isSecure","failAfter","debugLogger","args","isNumberValid","initialDelay","deprecatedLevelMethod","_connection","finalizeLogString","name","catch","connection","toString","isArray","getConsoleMethod","prop","unknownLevel","val","reconnection","JSON","disconnect","portSecure","bufferSize","lvl","Date","serializedEmpty","_serialize","toISOString","unshift","safeLevel","noLogMessage","$modifiedLog","ch","reconnectMaxDelay","nextTick","errMsg","isEmpty","conn","write","record","then","enc","log","on","opts","defaults","connect","apply","emit","CleartextStream","authError","slice","arguments","initialize","secure","debugEnabled","token","replacer","host","port","withStack","withLevel","flattenArrays","flatten","debug","undefined","lvlName","value","enumerable","levelUtil","normalize","invalidToken","test","noToken","optionsNotObj","isObject","objectMode","register","module","newline"],"mappings":"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"}
\No newline at end of file