fixed up logger error to make it better to handle in code

This commit is contained in:
Bojan Kucera 2025-06-07 11:58:24 -04:00
parent db66687f48
commit d0bb4db042
18 changed files with 51 additions and 45 deletions

View file

@ -185,7 +185,7 @@ export class HybridCache implements CacheProvider {
return isHealthy;
} catch (error) {
this.logger.error('Hybrid cache health check failed', { error });
this.logger.error('Hybrid cache health check failed', error);
return false;
}
}

View file

@ -222,7 +222,7 @@ export class MemoryCache implements CacheProvider {
await this.del('__health_check__');
return result === 'ok';
} catch (error) {
this.logger.error('Memory cache health check failed', { error });
this.logger.error('Memory cache health check failed', error);
return false;
}
}

View file

@ -212,7 +212,7 @@ export class RedisCache implements CacheProvider {
const pong = await this.redis.ping();
return pong === 'PONG' && this.isConnected;
} catch (error) {
this.logger.error('Redis health check failed', { error });
this.logger.error('Redis health check failed', error);
return false;
}
}

View file

@ -150,7 +150,7 @@ export class EventBus extends EventEmitter {
}
}
} catch (error) {
this.logger.error(`Failed to subscribe to event: ${eventType}`, { error });
this.logger.error(`Failed to subscribe to event: ${eventType}`, error);
throw error;
}
}
@ -271,7 +271,7 @@ export class EventBus extends EventEmitter {
} catch (error) {
retryCount++;
this.logger.error(`Error processing stream message ${msgId} (attempt ${retryCount}):`, { error });
this.logger.error(`Error processing stream message ${msgId} (attempt ${retryCount}):`, error);
if (retryCount >= this.maxRetries) {
await this.moveToDeadLetterQueue(msgId, fields, streamKey, groupName, error);
@ -325,7 +325,7 @@ export class EventBus extends EventEmitter {
this.logger.debug(`Claimed and processed ${claimedMessages.length} pending messages`);
} catch (error) {
this.logger.error('Error claiming pending messages:', { error });
this.logger.error('Error claiming pending messages:', error);
}
}
@ -409,7 +409,7 @@ export class EventBus extends EventEmitter {
}
}
} catch (error) {
this.logger.error(`Failed to unsubscribe from event: ${eventType}`, { error });
this.logger.error(`Failed to unsubscribe from event: ${eventType}`, error);
}
}
}
@ -446,7 +446,7 @@ export class EventBus extends EventEmitter {
try {
return await this.redis.xinfo('STREAM', streamKey);
} catch (error) {
this.logger.error(`Failed to get stream info for: ${eventType}`, { error });
this.logger.error(`Failed to get stream info for: ${eventType}`, error);
throw error;
}
}
@ -460,7 +460,7 @@ export class EventBus extends EventEmitter {
try {
return await this.redis.xlen(streamKey);
} catch (error) {
this.logger.error(`Failed to get stream length for: ${eventType}`, { error });
this.logger.error(`Failed to get stream length for: ${eventType}`, error);
return 0;
}
}
@ -489,7 +489,7 @@ export class EventBus extends EventEmitter {
id
}));
} catch (error) {
this.logger.error(`Failed to read stream history for: ${eventType}`, { error });
this.logger.error(`Failed to read stream history for: ${eventType}`, error);
return [];
}
}
@ -503,7 +503,7 @@ export class EventBus extends EventEmitter {
try {
return await this.redis.xtrim(streamKey, 'MAXLEN', '~', maxLength);
} catch (error) {
this.logger.error(`Failed to trim stream: ${eventType}`, { error });
this.logger.error(`Failed to trim stream: ${eventType}`, error);
return 0;
}
}
@ -537,7 +537,7 @@ export class EventBus extends EventEmitter {
}
}
} catch (error) {
this.logger.error(`Error replaying event: ${event.id}`, { error });
this.logger.error(`Error replaying event: ${event.id}`, error);
}
}

View file

@ -135,8 +135,12 @@ export class Logger {
this.log('warn', message, metadata);
}
error(message: string | object, metadata?: LogMetadata & { error?: any }): void {
const data = { ...metadata };
error(message: string | object, metadata?: LogMetadata & { error?: any } | unknown): void {
// If metadata is an Error, normalize it
if(metadata instanceof Error){
metadata = { error: metadata };
}
const data = typeof metadata === 'object' ? { ...metadata } : { error: message } as any;
// Handle any type of error automatically
if (data.error) {

View file

@ -145,7 +145,9 @@ describe('Advanced Logger Features', () => {
const logs = loggerTestHelpers.getCapturedLogs();
expect(logs.length).toBe(1);
expect(logs[0].context).toBe('batch processing');
}); it('should handle error objects with circular references', () => {
});
it('should handle error objects with circular references', () => {
const errorWithCircular: any = { name: 'CircularError', message: 'Circular reference error' };
// Create a simple circular reference
errorWithCircular.self = errorWithCircular;

View file

@ -107,7 +107,7 @@ describe('Basic Logger Tests', () => {
const error = new Error('Test error');
error.stack = 'Error stack trace';
logger.error('Error test', { error });
logger.error('Error test', error);
const logs = loggerTestHelpers.getCapturedLogs();
expect(logs.length).toBe(1);

View file

@ -123,7 +123,7 @@ describe('Logger Integration Tests', () => {
const error = new Error('Test error');
error.stack = 'Error stack trace';
logger.error('Error occurred', { error });
logger.error('Error occurred', error);
const logs = loggerTestHelpers.getCapturedLogs();
expect(logs.length).toBe(1);

View file

@ -138,7 +138,7 @@ export class PostgreSQLClient {
} catch (error) {
const executionTime = Date.now() - startTime;
this.logger.error(`Query failed after ${executionTime}ms:`, {
error: (error as Error).message,
error,
query: text,
params
});
@ -320,8 +320,8 @@ export class PostgreSQLClient {
private setupErrorHandlers(): void {
if (!this.pool) return;
this.pool.on('error', (err) => {
this.logger.error('PostgreSQL pool error:', err);
this.pool.on('error', (error) => {
this.logger.error('PostgreSQL pool error:', error);
});
this.pool.on('connect', () => {

View file

@ -44,13 +44,13 @@ export class QuestDBHealthMonitor {
try {
await this.performHealthCheck();
} catch (error) {
this.logger.error('Health check failed', { error });
this.logger.error('Health check failed', error);
}
}, intervalMs);
// Perform initial health check
this.performHealthCheck().catch(error => {
this.logger.error('Initial health check failed', { error });
this.logger.error('Initial health check failed', error);
});
}

View file

@ -362,7 +362,7 @@ export class QuestDBInfluxWriter {
if (attempt <= options.retryAttempts) {
await this.sleep(options.retryDelay * attempt); // Exponential backoff
} else {
throw new Error(`Failed to write to QuestDB after ${options.retryAttempts} attempts: ${error}`);
throw new Error(`Failed to write to QuestDB after ${options.retryAttempts} attempts: $error`);
}
}
}
@ -380,7 +380,7 @@ export class QuestDBInfluxWriter {
try {
await this.flush(options);
} catch (error) {
this.logger.error('Scheduled flush failed', { error });
this.logger.error('Scheduled flush failed', error);
}
}, options.flushInterval);
}

View file

@ -166,7 +166,7 @@ export class QuestDBSchemaManager {
await this.createTable(schema);
this.logger.info(`Table ${tableName} created successfully`);
} catch (error) {
this.logger.error(`Failed to create table ${tableName}`, { error });
this.logger.error(`Failed to create table ${tableName}`, error);
throw error;
}
}
@ -201,7 +201,7 @@ export class QuestDBSchemaManager {
await this.client.query(sql);
this.logger.info(`Table ${tableName} dropped`);
} catch (error) {
this.logger.error(`Failed to drop table ${tableName}`, { error });
this.logger.error(`Failed to drop table ${tableName}`, error);
throw error;
}
}
@ -219,7 +219,7 @@ export class QuestDBSchemaManager {
return result.rows.length > 0 && result.rows[0].count > 0;
} catch (error) {
this.logger.error(`Error checking if table exists: ${tableName}`, { error });
this.logger.error(`Error checking if table exists: ${tableName}`, error);
return false;
}
}
@ -260,7 +260,7 @@ export class QuestDBSchemaManager {
const stats = await this.getTableStats(tableName);
this.logger.info(`Table ${tableName} stats`, stats);
} catch (error) {
this.logger.error(`Failed to optimize table ${tableName}`, { error });
this.logger.error(`Failed to optimize table ${tableName}`, error);
throw error;
}
}
@ -280,7 +280,7 @@ export class QuestDBSchemaManager {
return result.rows[0] || {};
} catch (error) {
this.logger.error(`Failed to get table stats for ${tableName}`, { error });
this.logger.error(`Failed to get table stats for ${tableName}`, error);
throw error;
}
}
@ -293,7 +293,7 @@ export class QuestDBSchemaManager {
await this.client.query(`TRUNCATE TABLE ${tableName}`);
this.logger.info(`Table ${tableName} truncated`);
} catch (error) {
this.logger.error(`Failed to truncate table ${tableName}`, { error });
this.logger.error(`Failed to truncate table ${tableName}`, error);
throw error;
}
}

View file

@ -162,7 +162,7 @@ export class VectorEngine {
signals
};
} catch (error) {
this.logger.error('Vectorized strategy execution failed', { error });
this.logger.error('Vectorized strategy execution failed', error);
throw error;
}
}
@ -383,7 +383,7 @@ export class VectorEngine {
this.logger.info(`Running vectorized backtest for strategy: ${strategy.id}`);
results[strategy.id] = await this.executeVectorizedStrategy(data, strategy.code);
} catch (error) {
this.logger.error(`Backtest failed for strategy: ${strategy.id}`, { error });
this.logger.error(`Backtest failed for strategy: ${strategy.id}`, error);
// Continue with other strategies
}
}