Advertisement

← vibesdk

worker/logger/index.ts

2.5 KB Download file
/**
 * Simple Structured Logging System
 */

export * from './types';
export * from './core';

import { createLogger, createObjectLogger, LoggerFactory } from './core';
import { DEFAULT_CONFIG } from './core';

// Configure logger for Cloudflare Workers environment
LoggerFactory.configure(DEFAULT_CONFIG);

/**
 * Main Logger utilities - simplified API
 */
export const Logger = {
	/**
	 * Create a component logger
	 */
	create: createLogger,

	/**
	 * Create an object logger
	 */
	forObject: createObjectLogger,

	/**
	 * Configure global logging settings
	 */
	configure: LoggerFactory.configure.bind(LoggerFactory),

	/**
	 * Get current configuration
	 */
	getConfig: LoggerFactory.getConfig.bind(LoggerFactory),
};

/**
 * Method decorator for automatic logging (simplified)
 */
export function LogMethod(component?: string) {
	return function (
		target: unknown,
		propertyKey: string,
		descriptor: PropertyDescriptor,
	) {
		const originalMethod = descriptor.value;
		const className =
			(target as Record<string, unknown>)?.constructor?.name ||
			'UnknownClass';
		const methodName = propertyKey;
		const loggerComponent = component || className;

		descriptor.value = function (this: unknown, ...args: unknown[]) {
			const logger = createObjectLogger(this, loggerComponent);

			logger.debug(`Entering method: ${methodName}`, {
				argsCount: args.length,
			});
			try {
				const result = originalMethod.apply(this, args);
				if (result && typeof result === 'object' && 'then' in result) {
					// Handle async methods
					return (result as Promise<unknown>).then(
						(res) => {
							logger.debug(`Exiting method: ${methodName}`, {
								success: true,
							});
							return res;
						},
						(error) => {
							logger.error(`Method ${methodName} failed`, error);
							throw error;
						},
					);
				} else {
					logger.debug(`Exiting method: ${methodName}`, {
						success: true,
					});
					return result;
				}
			} catch (error) {
				logger.error(`Method ${methodName} failed`, error);
				throw error;
			}
		};

		return descriptor;
	};
}

/**
 * Class decorator for automatic logger injection
 */
export function WithLogger(component?: string) {
	return function <T extends new (...args: any[]) => object>(constructor: T) {
		return class extends constructor {
			logger = createObjectLogger(
				this,
				component || constructor.name,
			);
			constructor(...args: any[]) {
				super(...args);
			}
		};
	};
}

// Export default logger instance for quick usage
export default Logger;