winston-transport-sentry-node
Version:
@sentry/node transport for the winston v3 logger
118 lines • 4.66 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
const tslib_1 = require("tslib");
const Sentry = (0, tslib_1.__importStar)(require("@sentry/node"));
const TransportStream = require("winston-transport");
const triple_beam_1 = require("triple-beam");
var SentrySeverity;
(function (SentrySeverity) {
SentrySeverity["Debug"] = "debug";
SentrySeverity["Log"] = "log";
SentrySeverity["Info"] = "info";
SentrySeverity["Warning"] = "warning";
SentrySeverity["Error"] = "error";
SentrySeverity["Fatal"] = "fatal";
})(SentrySeverity || (SentrySeverity = {}));
const DEFAULT_LEVELS_MAP = {
silly: SentrySeverity.Debug,
verbose: SentrySeverity.Debug,
info: SentrySeverity.Info,
debug: SentrySeverity.Debug,
warn: SentrySeverity.Warning,
error: SentrySeverity.Error,
};
class ExtendedError extends Error {
constructor(info) {
super(info.message);
this.name = info.name || "Error";
if (info.stack && typeof info.stack === "string") {
this.stack = info.stack;
}
}
}
class SentryTransport extends TransportStream {
constructor(opts) {
super(opts);
this.silent = false;
this.levelsMap = {};
this.setLevelsMap = (options) => {
if (!options) {
return DEFAULT_LEVELS_MAP;
}
const customLevelsMap = Object.keys(options).reduce((acc, winstonSeverity) => {
acc[winstonSeverity] = options[winstonSeverity];
return acc;
}, {});
return Object.assign(Object.assign({}, DEFAULT_LEVELS_MAP), customLevelsMap);
};
this.levelsMap = this.setLevelsMap(opts && opts.levelsMap);
this.silent = (opts && opts.silent) || false;
if (!opts || !opts.skipSentryInit) {
Sentry.init(SentryTransport.withDefaults((opts && opts.sentry) || {}));
}
}
log(info, callback) {
var _a;
setImmediate(() => {
this.emit("logged", info);
});
if (this.silent)
return callback();
const { message, tags, user } = info, meta = (0, tslib_1.__rest)(info, ["message", "tags", "user"]);
const winstonLevel = info[triple_beam_1.LEVEL];
const sentryLevel = this.levelsMap[winstonLevel];
const scope = Sentry.getCurrentScope();
scope.clear();
if (tags !== undefined && SentryTransport.isObject(tags)) {
scope.setTags(tags);
}
scope.setExtras(meta);
if (user !== undefined && SentryTransport.isObject(user)) {
scope.setUser(user);
}
// TODO: add fingerprints
// scope.setFingerprint(['{{ default }}', path]); // fingerprint should be an array
// scope.clear();
// TODO: add breadcrumbs
// Sentry.addBreadcrumb({
// message: 'My Breadcrumb',
// // ...
// });
// Capturing Errors / Exceptions
if (SentryTransport.shouldLogException(sentryLevel)) {
const error = (_a = Object.values(info).find((value) => value instanceof Error)) !== null && _a !== void 0 ? _a : new ExtendedError(info);
Sentry.captureException(error, { tags, level: sentryLevel });
return callback();
}
// Capturing Messages
Sentry.captureMessage(message, sentryLevel);
return callback();
}
end(...args) {
Sentry.flush().then(() => {
super.end(...args);
});
return this;
}
get sentry() {
return Sentry;
}
static withDefaults(options) {
return Object.assign(Object.assign({}, options), { dsn: (options && options.dsn) || process.env.SENTRY_DSN || "", serverName: (options && options.serverName) || "winston-transport-sentry-node", environment: (options && options.environment) ||
process.env.SENTRY_ENVIRONMENT ||
process.env.NODE_ENV ||
"production", debug: (options && options.debug) || !!process.env.SENTRY_DEBUG || false, sampleRate: (options && options.sampleRate) || 1.0, maxBreadcrumbs: (options && options.maxBreadcrumbs) || 100 });
}
// private normalizeMessage(msg: any) {
// return msg && msg.message ? msg.message : msg;
// }
static isObject(obj) {
const type = typeof obj;
return type === "function" || (type === "object" && !!obj);
}
static shouldLogException(level) {
return level === SentrySeverity.Fatal || level === SentrySeverity.Error;
}
}
exports.default = SentryTransport;
//# sourceMappingURL=transport.js.map