logs-interceptor
Version:
High-performance, production-ready log interceptor for Node.js applications with Loki integration. Built with Clean Architecture principles. Supports Node.js, Browser, and Node-RED.
98 lines • 3.21 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.ConsoleInterceptor = void 0;
const utils_1 = require("../../utils");
class ConsoleInterceptor {
constructor(logger, preserveOriginal = true) {
this.logger = logger;
this.preserveOriginal = preserveOriginal;
this.enabled = false;
this.originalConsole = {
log: console.log.bind(console),
info: console.info.bind(console),
warn: console.warn.bind(console),
error: console.error.bind(console),
debug: console.debug.bind(console),
};
}
intercept(level, message, context) {
if (!this.enabled) {
return;
}
// Skip logs from logs-interceptor itself
const stack = new Error().stack || '';
if (stack.includes('logs-interceptor')) {
if (this.preserveOriginal) {
this.callOriginal(level, message, context);
}
return;
}
this.logger.log(level, message, context);
if (this.preserveOriginal) {
this.callOriginal(level, message, context);
}
}
enable() {
if (this.enabled) {
return;
}
this.enabled = true;
const methodMap = {
log: 'info',
info: 'info',
warn: 'warn',
error: 'error',
debug: 'debug',
};
['log', 'info', 'warn', 'error', 'debug'].forEach((method) => {
const original = this.originalConsole[method];
const level = methodMap[method];
console[method] = (...args) => {
const message = args
.map((arg) => typeof arg === 'string' ? arg : (0, utils_1.safeStringify)(arg))
.join(' ');
this.intercept(level, message, { source: 'console' });
};
});
}
disable() {
if (!this.enabled) {
return;
}
this.enabled = false;
this.restore();
}
isEnabled() {
return this.enabled;
}
restore() {
console.log = this.originalConsole.log;
console.info = this.originalConsole.info;
console.warn = this.originalConsole.warn;
console.error = this.originalConsole.error;
console.debug = this.originalConsole.debug;
}
callOriginal(level, message, context) {
const fullMessage = context
? `${message} ${(0, utils_1.safeStringify)(context)}`
: message;
switch (level) {
case 'debug':
this.originalConsole.debug(fullMessage);
break;
case 'info':
this.originalConsole.info(fullMessage);
break;
case 'warn':
this.originalConsole.warn(fullMessage);
break;
case 'error':
this.originalConsole.error(fullMessage);
break;
default:
this.originalConsole.log(fullMessage);
}
}
}
exports.ConsoleInterceptor = ConsoleInterceptor;
//# sourceMappingURL=ConsoleInterceptor.js.map