@mcph/bunyan-raven
Version:
A bunyan-compatible stream interface that sends error logs to raven-node.
72 lines • 2.49 kB
JavaScript
;
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