UNPKG

@bothive/session-logger

Version:

Pino session logger

97 lines (96 loc) 4.13 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.SessionLogger = void 0; const tslib_1 = require("tslib"); const helpers_1 = require("@bothive/helpers"); const cls_hooked_1 = require("cls-hooked"); const pino_1 = tslib_1.__importDefault(require("pino")); const config_1 = tslib_1.__importStar(require("./config")); const enumeration_1 = require("./enumeration"); const helper_1 = require("./helper"); class SessionLogger { constructor(config) { this.config = config; this.env = this.config.environment.toUpperCase(); this.logger = (0, pino_1.default)({ redact: { remove: true, paths: this.config.masking ? [...config_1.basePropsToRedact, ...config_1.secretsToRedact] : config_1.basePropsToRedact, }, formatters: { level: (label) => ({ severity: (0, helper_1.formatGcpSeverity)(label) }), }, prettyPrint: this.config.prettyPrint && config_1.prettyPrintOptions, level: this.config.logLevel, messageKey: "message", mixin: this.metaMixin.bind(this), }); } fatal(message, meta) { this.logger.fatal(meta, message); } error(message, meta) { this.logger.error(meta, message); } warn(message, meta) { this.logger.warn(meta, message); } info(message, meta) { this.logger.info(meta, message); } debug(message, meta) { this.logger.debug(meta, message); } trace(message, meta) { this.logger.trace(meta, message); } static HttpMiddleware(req, _res, next) { const namespace = (0, cls_hooked_1.createNamespace)(config_1.default.namespaceKey); return namespace.run(() => { const traceId = req.headers.get(config_1.default.traceIdHeader) || helpers_1.generatorHelpers.generateId(); const sessionId = req.headers.get(config_1.default.sessionIdHeader); namespace.set(enumeration_1.ENamespaceValues.sessionId, sessionId); namespace.set(enumeration_1.ENamespaceValues.traceId, traceId); namespace.set(enumeration_1.ENamespaceValues.cloudTraceId, traceId); next(); }); } static EventMiddleware(event, callback) { const namespace = (0, cls_hooked_1.createNamespace)(config_1.default.namespaceKey); return namespace.run(() => { const traceId = event.headers?.traceId || helpers_1.generatorHelpers.generateId(); namespace.set(enumeration_1.ENamespaceValues.context, event.headers?.context); namespace.set(enumeration_1.ENamespaceValues.sessionId, event.headers?.sessionId); namespace.set(enumeration_1.ENamespaceValues.traceId, traceId); namespace.set(enumeration_1.ENamespaceValues.cloudTraceId, traceId); callback(event); }); } metaMixin() { const namespace = (0, cls_hooked_1.getNamespace)(config_1.default.namespaceKey); const meta = { environment: this.env }; if (!namespace) { return meta; } return { ...meta, context: namespace.get(enumeration_1.ENamespaceValues.context), sessionId: namespace.get(enumeration_1.ENamespaceValues.sessionId), traceId: namespace.get(enumeration_1.ENamespaceValues.traceId), }; } static register(config) { if (this.instance) { SessionLogger.instance.warn("SessionLogger was already registered, registering now and overwriting the configuration. To use the logger instance just call the '.getLogger()' method", { context: SessionLogger.name, config }); } this.instance = new SessionLogger({ ...config_1.defaultConfig, ...config }); } static getLogger() { if (!this.instance) { throw Error("SessionLogger was not yet registered, please call the '.register' method first."); } return this.instance; } } exports.SessionLogger = SessionLogger; exports.default = () => SessionLogger.getLogger();