@sorrir/sorrir-logging
Version:
Logging repository for SORRIR projects.
354 lines • 13.4 kB
JavaScript
;
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