Ctrl K
ComunidadGuías…

console-instrumentation.ts

Rama master · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
import '@opentelemetry/api-logs';
import loggerProvider from './logger.js';

const SeverityNumber = {
	DEBUG: 5,
	INFO: 9,
	WARN: 13,
	ERROR: 17
};

function serializeMessage(...args: unknown[]): string {
	return args.map((arg) => (typeof arg === 'object' ? JSON.stringify(arg) : String(arg))).join(' ');
}

function isPlainRecord(v: unknown): v is Record<string, unknown> {
	return !!v && typeof v === 'object' && (v as { constructor?: unknown }).constructor === Object;
}

function toAttributeValue(v: unknown): string | number | boolean {
	if (typeof v === 'string' || typeof v === 'number' || typeof v === 'boolean') {
		return v;
	}
	if (v == null) {
		return '';
	}
	return JSON.stringify(v);
}

function attributesFromConsoleArgs(args: unknown[]): Record<string, string | number | boolean> {
	if (args.length >= 2 && typeof args[0] === 'string' && isPlainRecord(args[1])) {
		const attrs: Record<string, string | number | boolean> = { tag: args[0] };
		for (const [k, v] of Object.entries(args[1])) {
			attrs[k] = toAttributeValue(v);
		}
		return attrs;
	}
	if (args.length === 1 && isPlainRecord(args[0])) {
		const attrs: Record<string, string | number | boolean> = {};
		for (const [k, v] of Object.entries(args[0])) {
			attrs[k] = toAttributeValue(v);
		}
		return attrs;
	}
	if (args.length >= 1 && typeof args[0] === 'string' && /^\[.+\]$/.test(args[0])) {
		return { tag: args[0] };
	}
	return {};
}

if (loggerProvider) {
	const logger = loggerProvider.getLogger('default', '1.0.0');
	const originalConsole = {
		log: console.log,
		info: console.info,
		warn: console.warn,
		error: console.error,
		debug: console.debug
	};

	console.log = function (...args: unknown[]) {
		logger.emit({
			severityNumber: SeverityNumber.INFO,
			severityText: 'INFO',
			body: serializeMessage(...args),
			attributes: attributesFromConsoleArgs(args)
		});
		originalConsole.log.apply(console, args);
	};

	console.info = function (...args: unknown[]) {
		logger.emit({
			severityNumber: SeverityNumber.INFO,
			severityText: 'INFO',
			body: serializeMessage(...args),
			attributes: attributesFromConsoleArgs(args)
		});
		originalConsole.info.apply(console, args);
	};

	console.warn = function (...args: unknown[]) {
		logger.emit({
			severityNumber: SeverityNumber.WARN,
			severityText: 'WARN',
			body: serializeMessage(...args),
			attributes: attributesFromConsoleArgs(args)
		});
		originalConsole.warn.apply(console, args);
	};

	console.error = function (...args: unknown[]) {
		logger.emit({
			severityNumber: SeverityNumber.ERROR,
			severityText: 'ERROR',
			body: serializeMessage(...args),
			attributes: attributesFromConsoleArgs(args)
		});
		originalConsole.error.apply(console, args);
	};

	console.debug = function (...args: unknown[]) {
		logger.emit({
			severityNumber: SeverityNumber.DEBUG,
			severityText: 'DEBUG',
			body: serializeMessage(...args),
			attributes: attributesFromConsoleArgs(args)
		});
		originalConsole.debug.apply(console, args);
	};
}