@bothive/session-logger
Version:
Pino session logger
97 lines (96 loc) • 4.13 kB
JavaScript
;
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();