UNPKG

@mcph/bunyan-raven

Version:

A bunyan-compatible stream interface that sends error logs to raven-node.

72 lines 2.49 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const stream_1 = require("stream"); class WrappedError extends Error { constructor(errLike) { super(errLike.message); this.name = errLike.name; this.code = errLike.code; this.signal = errLike.signal; this.stack = errLike.stack; } } const levelNameMap = Object.freeze({ 10: 'debug', 20: 'debug', 30: 'info', 40: 'warning', 50: 'error', 60: 'fatal', }); class RavenStream extends stream_1.Writable { constructor(client) { super({ objectMode: true, }); this.client = client; } _write(record, _encoding, callback) { // mangle the error message a bit to make sure we have the log record's message // showing up on sentry as well or at least also logs the message itself if no error // object are provided. const err = record.err; // Get level value string, since bunyan uses numbers for levels const options = this.gatherRavenMetaData(record); if (!err) { this.client.captureMessage(record.msg, options); return callback(); } if (record.msg) { err.message = record.msg + ' (' + err.message + ')'; } if (err instanceof Error) { this.client.captureException(err, options); return callback(); } // Bunyan's serializer kicks in in some cases which requires reconverting the object to an error this.client.captureException(new WrappedError(err), options); return callback(); } gatherRavenMetaData(record) { const options = { tags: Object.assign({}, record.tags, { name: record.name, hostname: record.hostname, pid: String(record.pid) }), user: record.user, extra: {}, }; if (record.level && typeof record.level === 'number') { // Level doesn't go in tags or extra options.level = levelNameMap[record.level]; } // Add 'extra' meta-data from record const skip = ['name', 'hostname', 'pid', 'msg', 'time', 'v', 'err', 'level', 'tags', 'user']; for (const key in record) { if (skip.includes(key)) { continue; } options.extra[key] = record[key]; } return options; } } exports.RavenStream = RavenStream; //# sourceMappingURL=index.js.map