UNPKG

@sorrir/sorrir-logging

Version:

Logging repository for SORRIR projects.

354 lines 13.4 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.logDefault = exports.info = exports.error = exports.warn = exports.debug = exports.logCompact = exports.log = exports.configLogger = exports.getLogger = exports.sorrirLogger = exports.LogLevel = exports.Stakeholder = void 0; const logform = require("logform"); const logger = require("winston"); const winston_elasticsearch_1 = require("winston-elasticsearch"); const elasticsearch_1 = require("@elastic/elasticsearch"); const os = require("os"); var Stakeholder; (function (Stakeholder) { Stakeholder["USER"] = "USER"; Stakeholder["SYSTEM"] = "SYSTEM"; })(Stakeholder = exports.Stakeholder || (exports.Stakeholder = {})); var LogLevel; (function (LogLevel) { LogLevel["info"] = "info"; LogLevel["debug"] = "debug"; LogLevel["warn"] = "warn"; LogLevel["error"] = "error"; })(LogLevel = exports.LogLevel || (exports.LogLevel = {})); const metadataFormat = logform.format.metadata({ fillWith: ["context", "host", "data"], }); exports.sorrirLogger = getLogger(); /** * The logger aqcuired by this method logs to stdout if the app runs in * production of if either one of SORRIR_ES_URL, SORRIR_ES_USER or SORRIR_ES_PASSWORD * are not set. * Otherwise it logs to the specified Elasticsearch instance. */ function getLogger() { let transportMethods; if (process.env.NODE_ENV !== "production" && process.env.SORRIR_ES_URL && process.env.SORRIR_ES_USER && process.env.SORRIR_ES_PASSWORD) { const esNodeUrl = process.env.SORRIR_ES_URL; const esAuthConfig = { username: process.env.SORRIR_ES_USER, password: process.env.SORRIR_ES_PASSWORD, }; const esIndex = process.env.SORRIR_ES_INDEX; const esIndexPrefix = process.env.SORRIR_ES_INDEX_PREFIX ? process.env.SORRIR_ES_INDEX_PREFIX : "filebeat-debug"; const esContextDebug = process.env.SORRIR_ES_DEBUG; // Needed in order to add context.debug field // See: https://github.com/vanthome/winston-elasticsearch/blob/188164eb282b7aa06d7a2e125a5a18dec38e4ab3/transformer.js const transformer = function (logData) { const transformed = {}; transformed["@timestamp"] = logData.timestamp ? logData.timestamp : new Date().toISOString(); transformed["message"] = logData.message; transformed["severity"] = logData.level; transformed["fields"] = esContextDebug ? Object.assign(Object.assign({}, logData.meta), { "metadata.context.debug": esContextDebug }) : logData.meta; if (logData.meta["transaction.id"]) transformed["transaction"] = { id: logData.meta["transaction.id"] }; if (logData.meta["trace.id"]) transformed["trace"] = { id: logData.meta["trace.id"] }; if (logData.meta["span.id"]) transformed["span"] = { id: logData.meta["span.id"] }; return transformed; }; transportMethods = [ new winston_elasticsearch_1.ElasticsearchTransport({ client: new elasticsearch_1.Client({ node: esNodeUrl, auth: esAuthConfig, context: { testkey: "testvalue" }, }), // Only one of the following properties can be != undefined. // index has priority before indexPrefix. indexPrefix: esIndex ? undefined : esIndexPrefix, index: esIndex, level: "debug", transformer: transformer, }), ]; transportMethods.forEach((tr) => tr.on("warning", (error) => { console.error("Warning: ", error); })); } else { transportMethods = [new logger.transports.Console({ level: "debug" })]; } const logger_ = logger.createLogger({ format: logger.format.combine(logger.format.timestamp(), metadataFormat, logger.format.json() // logger.format.prettyPrint() ), transports: transportMethods, }); return logger_; } exports.getLogger = getLogger; const configUserMap = new Map(); const configSystemMap = new Map(); function configLogger(context) { let fileNameFull = ""; try { throw new Error(); } catch (e) { const allMatchesFile = e.stack.match(/[^/]*(\/.*\.[tj]s):[0-9].*/g); const callerMatchesFile = allMatchesFile[1].match(/[^/]*(\/.*\.[tj]s):[0-9].*$/); fileNameFull = callerMatchesFile[1]; } if ("area" in context) { configSystemMap.set(fileNameFull, context); } else { configUserMap.set(fileNameFull, context); } } exports.configLogger = configLogger; exports.log = function (level, message, data, contextFields) { if ("area" in contextFields) { return logSystem(level, message, data, contextFields); } else { return logUser(level, message, data, contextFields); } }; exports.logCompact = function (level, stakeholder, message, data) { let fileNameFull = ""; try { throw new Error(); } catch (e) { const allMatchesFile = e.stack.match(/[^/]*(\/.*\.[tj]s):[0-9].*/g); const callerMatchesFile = allMatchesFile[1].match(/[^/]*(\/.*\.[tj]s):[0-9].*$/); fileNameFull = callerMatchesFile[1]; if (stakeholder === Stakeholder.SYSTEM) { let contextFields = configSystemMap.get(fileNameFull); if (!contextFields) { contextFields = { area: "unknown", }; } return logSystem(level, message, data, contextFields); } else { let contextFields = configUserMap.get(fileNameFull); if (!contextFields) { contextFields = { unit: "unknown", component: "unknown", degradationMode: "unkown", }; } return logUser(level, message, data, contextFields); } } }; exports.debug = function (stakeholder, message, data, contextFields) { if (!contextFields) { let fileNameFull = ""; try { throw new Error(); } catch (e) { const allMatchesFile = e.stack.match(/[^/]*(\/.*\.[tj]s):[0-9].*/g); const callerMatchesFile = allMatchesFile[1].match(/[^/]*(\/.*\.[tj]s):[0-9].*$/); fileNameFull = callerMatchesFile[1]; if (stakeholder === Stakeholder.SYSTEM) { let contextFields = configSystemMap.get(fileNameFull); if (!contextFields) { contextFields = { area: "unknown", }; } return logSystem(LogLevel.debug, message, data, contextFields); } else { let contextFields = configUserMap.get(fileNameFull); if (!contextFields) { contextFields = { unit: "unknown", component: "unknown", degradationMode: "unkown", }; } return logUser(LogLevel.debug, message, data, contextFields); } } } if ("area" in contextFields) { return logSystem(LogLevel.debug, message, data, contextFields); } else { return logUser(LogLevel.debug, message, data, contextFields); } }; exports.warn = function (stakeholder, message, data, contextFields) { if (!contextFields) { let fileNameFull = ""; try { throw new Error(); } catch (e) { const allMatchesFile = e.stack.match(/[^/]*(\/.*\.[tj]s):[0-9].*/g); const callerMatchesFile = allMatchesFile[1].match(/[^/]*(\/.*\.[tj]s):[0-9].*$/); fileNameFull = callerMatchesFile[1]; if (stakeholder === Stakeholder.SYSTEM) { let contextFields = configSystemMap.get(fileNameFull); if (!contextFields) { contextFields = { area: "unknown", }; } return logSystem(LogLevel.warn, message, data, contextFields); } else { let contextFields = configUserMap.get(fileNameFull); if (!contextFields) { contextFields = { unit: "unknown", component: "unknown", degradationMode: "unkown", }; } return logUser(LogLevel.warn, message, data, contextFields); } } } if ("area" in contextFields) { return logSystem(LogLevel.warn, message, data, contextFields); } else { return logUser(LogLevel.warn, message, data, contextFields); } }; exports.error = function (stakeholder, message, data, contextFields) { if (!contextFields) { let fileNameFull = ""; try { throw new Error(); } catch (e) { const allMatchesFile = e.stack.match(/[^/]*(\/.*\.[tj]s):[0-9].*/g); const callerMatchesFile = allMatchesFile[1].match(/[^/]*(\/.*\.[tj]s):[0-9].*$/); fileNameFull = callerMatchesFile[1]; if (stakeholder === Stakeholder.SYSTEM) { let contextFields = configSystemMap.get(fileNameFull); if (!contextFields) { contextFields = { area: "unknown", }; } return logSystem(LogLevel.error, message, data, contextFields); } else { let contextFields = configUserMap.get(fileNameFull); if (!contextFields) { contextFields = { unit: "unknown", component: "unknown", degradationMode: "unkown", }; } return logUser(LogLevel.error, message, data, contextFields); } } } if ("area" in contextFields) { return logSystem(LogLevel.error, message, data, contextFields); } else { return logUser(LogLevel.error, message, data, contextFields); } }; exports.info = function (stakeholder, message, data, contextFields) { if (!contextFields) { let fileNameFull = ""; try { throw new Error(); } catch (e) { const allMatchesFile = e.stack.match(/[^/]*(\/.*\.[tj]s):[0-9].*/g); const callerMatchesFile = allMatchesFile[1].match(/[^/]*(\/.*\.[tj]s):[0-9].*$/); fileNameFull = callerMatchesFile[1]; if (stakeholder === Stakeholder.SYSTEM) { let contextFields = configSystemMap.get(fileNameFull); if (!contextFields) { contextFields = { area: "unknown", }; } return logSystem(LogLevel.info, message, data, contextFields); } else { let contextFields = configUserMap.get(fileNameFull); if (!contextFields) { contextFields = { unit: "unknown", component: "unknown", degradationMode: "unkown", }; } return logUser(LogLevel.info, message, data, contextFields); } } } if ("area" in contextFields) { return logSystem(LogLevel.info, message, data, contextFields); } else { return logUser(LogLevel.info, message, data, contextFields); } }; exports.logDefault = function (level, message) { return exports.sorrirLogger.log(level.toString(), message); }; const logSystem = function (level, message, data, contextFieldsStripped) { let fileName = ""; let funcName = ""; try { throw new Error(); } catch (e) { const allMatchesFile = e.stack.match(/.*\/(.*\.[tj]s):[0-9].*/g); const callerMatchesFile = allMatchesFile[2].match(/.*\/(.*\.[tj]s):[0-9].*$/); fileName = callerMatchesFile[1]; const allMatchesFunc = e.stack.match(/@|at (.+) \(/g); const callerMatchesFunc = allMatchesFunc[3].match(/@|at (.+) \(/); funcName = callerMatchesFunc[1]; } const context = { stakeholder: Stakeholder.SYSTEM, contextFields: { file: fileName, area: contextFieldsStripped ? contextFieldsStripped.area : undefined, function: funcName, }, }; return exports.sorrirLogger.log(level.toString(), message, { context: context, host: os.hostname(), data: data, }); }; const logUser = function (level, message, data, contextFields) { const context = { stakeholder: Stakeholder.USER, contextFields: contextFields, }; return exports.sorrirLogger.log(level.toString(), message, { context: context, host: os.hostname(), data: data, }); }; //# sourceMappingURL=app.js.map