UNPKG

filebeat-logger

Version:

A winston logger that prints json lines in elastic common schema format

103 lines 14.2 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.Utils = void 0; class Utils { static addTimestamp(info) { info["@timestamp"] = `${new Date().toISOString()}`; } static addLogLevel(info) { info["log.level"] = info["level"]; delete info["level"]; } static expandError(info) { const err = info["error"] || info["err"]; if (err) { info["error.message"] = err.message; info["error.stack_trace"] = err.stack; info["error.type"] = err.name; if (err.code) { info["error.code"] = String(err.code); } if (err.errno) { info["error.errno"] = String(err.errno); } if (err.syscall) { info["error.syscall"] = String(err.syscall); } if (err.cause?.code) { info["error.cause.code"] = err.cause.code; } if (err.cause?.hostname) { info["error.cause.hostname"] = err.cause.hostname; } delete info["error"]; delete info["err"]; } } static expandRequest(info) { const req = info["request"] || info["req"]; if (!req) return; if (req.headers) { const protocol = (req.protocol ?? req.headers["x-forwarded-proto"] ?? "https").replace(":", ""); const url = new URL(req.url, `${protocol}://${req.headers.host}`); info["url.path"] = url.pathname; info["url.full"] = url.href; info["url.domain"] = url.host; info["url.query"] = url.search.substring(1); info["url.scheme"] = url.protocol.slice(0, -1); } if (req.method && typeof req.method === "string") { info["http.request.method"] = req.method.toUpperCase(); } delete info["request"]; delete info["req"]; } static expandResponse(info) { const res = info["response"] || info["res"]; if (!res) return; info["http.response.status_code"] = res.statusCode; delete info["response"]; delete info["res"]; } static addEnvironmentTag(info, appEnvironment = process.env["APP_ENV"]) { if (appEnvironment) { const tagList = info["tags"] ? info["tags"].split(",") : []; tagList.push(appEnvironment); info["tags"] = tagList.join(", "); } } static explodeJsonInMessage(info) { const message = info["message"] ?? ""; try { const exploded = JSON.parse(message); if (exploded instanceof Object && !(exploded instanceof Array)) { Object.keys(exploded).forEach(function (key) { info[key] = exploded[key]; }); } } catch (e) { // JSON parse fails, therefore message cannot be exploded, carry on } } static orderKeys(info, keysOrder) { const ordered = {}; const reverseKeysOrder = keysOrder.slice().reverse(); const orderedKeys = Object.keys(info).sort((a, b) => { return reverseKeysOrder.indexOf(b) - reverseKeysOrder.indexOf(a); }); for (const key of orderedKeys) { ordered[key] = info[key]; } for (const key of Object.keys(info)) { delete info[key]; } for (const [key, value] of Object.entries(ordered)) { info[key] = value; } } } exports.Utils = Utils; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJ1dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxNQUFhLEtBQUs7SUFFZCxNQUFNLENBQUMsWUFBWSxDQUFDLElBQVM7UUFDekIsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDO0lBQ3ZELENBQUM7SUFFRCxNQUFNLENBQUMsV0FBVyxDQUFDLElBQVM7UUFDeEIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNsQyxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUN6QixDQUFDO0lBRUQsTUFBTSxDQUFDLFdBQVcsQ0FBQyxJQUFTO1FBQ3hCLE1BQU0sR0FBRyxHQUFRLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFOUMsSUFBSSxHQUFHLEVBQUUsQ0FBQztZQUNOLElBQUksQ0FBQyxlQUFlLENBQUMsR0FBRyxHQUFHLENBQUMsT0FBTyxDQUFDO1lBQ3BDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUM7WUFDdEMsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUM7WUFDOUIsSUFBSSxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQ1gsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDMUMsQ0FBQztZQUNELElBQUksR0FBRyxDQUFDLEtBQUssRUFBRSxDQUFDO2dCQUNaLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzVDLENBQUM7WUFDRCxJQUFJLEdBQUcsQ0FBQyxPQUFPLEVBQUUsQ0FB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QWdCLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNyRSxDQUFDLENBQUMsQ0FBQztRQUVILEtBQUssTUFBTSxHQUFHLElBQUksV0FBVyxFQUFFLENBQUM7WUFDNUIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUM3QixDQUFDO1FBRUQsS0FBSyxNQUFNLEdBQUcsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDbEMsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDckIsQ0FBQztRQUVELEtBQUssTUFBTSxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDakQsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEtBQUssQ0FBQztRQUN0QixDQUFDO0lBQ0wsQ0FBQztDQUNKO0FBL0dELHNCQStHQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBjbGFzcyBVdGlscyB7XG5cbiAgICBzdGF0aWMgYWRkVGltZXN0YW1wKGluZm86IGFueSk6IHZvaWQge1xuICAgICAgICBpbmZvW1wiQHRpbWVzdGFtcFwiXSA9IGAke25ldyBEYXRlKCkudG9JU09TdHJpbmcoKX1gO1xuICAgIH1cblxuICAgIHN0YXRpYyBhZGRMb2dMZXZlbChpbmZvOiBhbnkpOiB2b2lkIHtcbiAgICAgICAgaW5mb1tcImxvZy5sZXZlbFwiXSA9IGluZm9bXCJsZXZlbFwiXTtcbiAgICAgICAgZGVsZXRlIGluZm9bXCJsZXZlbFwiXTtcbiAgICB9XG5cbiAgICBzdGF0aWMgZXhwYW5kRXJyb3IoaW5mbzogYW55KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGVycjogYW55ID0gaW5mb1tcImVycm9yXCJdIHx8IGluZm9bXCJlcnJcIl07XG5cbiAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgaW5mb1tcImVycm9yLm1lc3NhZ2VcIl0gPSBlcnIubWVzc2FnZTtcbiAgICAgICAgICAgIGluZm9bXCJlcnJvci5zdGFja190cmFjZVwiXSA9IGVyci5zdGFjaztcbiAgICAgICAgICAgIGluZm9bXCJlcnJvci50eXBlXCJdID0gZXJyLm5hbWU7XG4gICAgICAgICAgICBpZiAoZXJyLmNvZGUpIHtcbiAgICAgICAgICAgICAgICBpbmZvW1wiZXJyb3IuY29kZVwiXSA9IFN0cmluZyhlcnIuY29kZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZXJyLmVycm5vKSB7XG4gICAgICAgICAgICAgICAgaW5mb1tcImVycm9yLmVycm5vXCJdID0gU3RyaW5nKGVyci5lcnJubyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZXJyLnN5c2NhbGwpIHtcbiAgICAgICAgICAgICAgICBpbmZvW1wiZXJyb3Iuc3lzY2FsbFwiXSA9IFN0cmluZyhlcnIuc3lzY2FsbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZXJyLmNhdXNlPy5jb2RlKSB7XG4gICAgICAgICAgICAgICAgaW5mb1tcImVycm9yLmNhdXNlLmNvZGVcIl0gPSBlcnIuY2F1c2UuY29kZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChlcnIuY2F1c2U/Lmhvc3RuYW1lKSB7XG4gICAgICAgICAgICAgICAgaW5mb1tcImVycm9yLmNhdXNlLmhvc3RuYW1lXCJdID0gZXJyLmNhdXNlLmhvc3RuYW1lO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICBkZWxldGUgaW5mb1tcImVycm9yXCJdO1xuICAgICAgICAgICAgZGVsZXRlIGluZm9bXCJlcnJcIl07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzdGF0aWMgZXhwYW5kUmVxdWVzdChpbmZvOiBhbnkpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgcmVxOiBhbnkgPSBpbmZvW1wicmVxdWVzdFwiXSB8fCBpbmZvW1wicmVxXCJdO1xuICAgICAgICBpZiAoIXJlcSkgcmV0dXJuO1xuXG4gICAgICAgIGlmIChyZXEuaGVhZGVycykge1xuICAgICAgICAgICAgY29uc3QgcHJvdG9jb2wgPSAocmVxLnByb3RvY29sID8/IHJlcS5oZWFkZXJzW1wieC1mb3J3YXJkZWQtcHJvdG9cIl0gPz8gXCJodHRwc1wiKS5yZXBsYWNlKFwiOlwiLCBcIlwiKTtcbiAgICAgICAgICAgIGNvbnN0IHVybCA9IG5ldyBVUkwocmVxLnVybCwgYCR7cHJvdG9jb2x9Oi8vJHtyZXEuaGVhZGVycy5ob3N0fWApO1xuICAgICAgICAgICAgaW5mb1tcInVybC5wYXRoXCJdID0gdXJsLnBhdGhuYW1lO1xuICAgICAgICAgICAgaW5mb1tcInVybC5mdWxsXCJdID0gdXJsLmhyZWY7XG4gICAgICAgICAgICBpbmZvW1widXJsLmRvbWFpblwiXSA9IHVybC5ob3N0O1xuICAgICAgICAgICAgaW5mb1tcInVybC5xdWVyeVwiXSA9IHVybC5zZWFyY2guc3Vic3RyaW5nKDEpO1xuICAgICAgICAgICAgaW5mb1tcInVybC5zY2hlbWVcIl0gPSB1cmwucHJvdG9jb2wuc2xpY2UoMCwgLTEpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyZXEubWV0aG9kICYmIHR5cGVvZiByZXEubWV0aG9kID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICBpbmZvW1wiaHR0cC5yZXF1ZXN0Lm1ldGhvZFwiXSA9IHJlcS5tZXRob2QudG9VcHBlckNhc2UoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGRlbGV0ZSBpbmZvW1wicmVxdWVzdFwiXTtcbiAgICAgICAgZGVsZXRlIGluZm9bXCJyZXFcIl07XG4gICAgfVxuXG4gICAgc3RhdGljIGV4cGFuZFJlc3BvbnNlKGluZm86IGFueSk6IHZvaWQge1xuICAgICAgICBjb25zdCByZXM6IGFueSA9IGluZm9bXCJyZXNwb25zZVwiXSB8fCBpbmZvW1wicmVzXCJdO1xuICAgICAgICBpZiAoIXJlcykgcmV0dXJuO1xuXG4gICAgICAgIGluZm9bXCJodHRwLnJlc3BvbnNlLnN0YXR1c19jb2RlXCJdID0gcmVzLnN0YXR1c0NvZGU7XG5cbiAgICAgICAgZGVsZXRlIGluZm9bXCJyZXNwb25zZVwiXTtcbiAgICAgICAgZGVsZXRlIGluZm9bXCJyZXNcIl07XG4gICAgfVxuXG4gICAgc3RhdGljIGFkZEVudmlyb25tZW50VGFnKGluZm86IGFueSwgYXBwRW52aXJvbm1lbnQ6IHN0cmluZyB8IHVuZGVmaW5lZCA9IHByb2Nlc3MuZW52W1wiQVBQX0VOVlwiXSk6IHZvaWQge1xuICAgICAgICBpZiAoYXBwRW52aXJvbm1lbnQpIHtcbiAgICAgICAgICAgIGNvbnN0IHRhZ0xpc3QgPSBpbmZvW1widGFnc1wiXSA/IGluZm9bXCJ0YWdzXCJdLnNwbGl0KFwiLFwiKSA6IFtdO1xuICAgICAgICAgICAgdGFnTGlzdC5wdXNoKGFwcEVudmlyb25tZW50KTtcbiAgICAgICAgICAgIGluZm9bXCJ0YWdzXCJdID0gdGFnTGlzdC5qb2luKFwiLCBcIik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzdGF0aWMgZXhwbG9kZUpzb25Jbk1lc3NhZ2UoaW5mbzogYW55KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBpbmZvW1wibWVzc2FnZVwiXSA/PyBcIlwiO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgZXhwbG9kZWQgPSBKU09OLnBhcnNlKG1lc3NhZ2UpO1xuICAgICAgICAgICAgaWYgKGV4cGxvZGVkIGluc3RhbmNlb2YgT2JqZWN0ICYmICEoZXhwbG9kZWQgaW5zdGFuY2VvZiBBcnJheSkpIHtcbiAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyhleHBsb2RlZCkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgICAgICAgICAgIGluZm9ba2V5XSA9IGV4cGxvZGVkW2tleV07XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIC8vIEpTT04gcGFyc2UgZmFpbHMsIHRoZXJlZm9yZSBtZXNzYWdlIGNhbm5vdCBiZSBleHBsb2RlZCwgY2Fycnkgb25cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHN0YXRpYyBvcmRlcktleXMoaW5mbzogYW55LCBrZXlzT3JkZXI6IHN0cmluZ1tdKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IG9yZGVyZWQ6IGFueSA9IHt9O1xuICAgICAgICBjb25zdCByZXZlcnNlS2V5c09yZGVyID0ga2V5c09yZGVyLnNsaWNlKCkucmV2ZXJzZSgpO1xuICAgICAgICBjb25zdCBvcmRlcmVkS2V5czogc3RyaW5nW10gPSBPYmplY3Qua2V5cyhpbmZvKS5zb3J0KChhLCBiKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gcmV2ZXJzZUtleXNPcmRlci5pbmRleE9mKGIpIC0gcmV2ZXJzZUtleXNPcmRlci5pbmRleE9mKGEpO1xuICAgICAgICB9KTtcblxuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBvcmRlcmVkS2V5cykge1xuICAgICAgICAgICAgb3JkZXJlZFtrZXldID0gaW5mb1trZXldO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoaW5mbykpIHtcbiAgICAgICAgICAgIGRlbGV0ZSBpbmZvW2tleV07XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhvcmRlcmVkKSkge1xuICAgICAgICAgICAgaW5mb1trZXldID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICB9XG59XG4iXX0=