UNPKG

35.6 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\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 conn.write(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 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 } 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 /**\n * Stop reconnection along with its running connection(if any) and end the writable stream.\n */\n end() {\n // invoke disconnect of reconnection so any running connection\n // will be destroyed and we will stop reconnecting.\n this.reconnection.disconnect();\n super.end(...arguments);\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 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 resolve(connection);\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 });\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 static 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":[],"mappings":"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"}
\No newline at end of file