diff --git a/apps/data-service/src/index.ts b/apps/data-service/src/index.ts index 7870bd9..77c91d1 100644 --- a/apps/data-service/src/index.ts +++ b/apps/data-service/src/index.ts @@ -157,7 +157,7 @@ async function initializeServices() { const jobData = { handler: handlerName, operation: scheduledJob.operation, - ...(scheduledJob.payload || {}), + payload: scheduledJob.payload || {}, }; // Build job options from scheduled job config diff --git a/apps/data-service/src/providers/qm.provider.ts b/apps/data-service/src/providers/qm.provider.ts index 5c93fd4..be80fdc 100644 --- a/apps/data-service/src/providers/qm.provider.ts +++ b/apps/data-service/src/providers/qm.provider.ts @@ -70,9 +70,15 @@ export function initializeQMProvider() { { type: 'qm-maintnance', operation: 'spider-symbol-search', + payload: { + prefix: null, + depth: 1, + source: 'qm', + maxDepth: 4 + }, cronPattern: '0 0 * * 0', // Every Sunday at midnight priority: 10, - immediately: true, // Don't run on startup + immediately: true, // Don't run on startup - this is a heavy operation description: 'Comprehensive symbol search using QM API', }, ], diff --git a/libs/logger/src/logger.ts b/libs/logger/src/logger.ts index e47acd0..8af4b25 100644 --- a/libs/logger/src/logger.ts +++ b/libs/logger/src/logger.ts @@ -25,15 +25,22 @@ let globalConfig: LoggerConfig = { environment: 'development', }; +// Log level priorities for comparison +const LOG_LEVELS: Record = { + trace: 10, + debug: 20, + info: 30, + warn: 40, + error: 50, + fatal: 60, +}; + /** * Set global logger configuration */ export function setLoggerConfig(config: LoggerConfig): void { globalConfig = { ...globalConfig, ...config }; - // Clear cache to force recreation with new config loggerCache.clear(); - // eslint-disable-next-line no-console - console.log('Logger config updated:', globalConfig.logLevel); } /** * Create logger destination using multistream approach: @@ -49,12 +56,12 @@ function createDestination( // Console: In-process pretty stream for dev (fast shutdown) if (config.logConsole && config.environment !== 'production') { const prettyStream = pretty({ - sync: true, + sync: false, // IMPORTANT: Make async to prevent blocking the event loop colorize: true, translateTime: 'yyyy-mm-dd HH:MM:ss.l', messageFormat: '[{service}{childName}] {msg}', singleLine: false, // This was causing logs to be on one line - hideObject: true, // Hide metadata objects + hideObject: false, // Hide metadata objects ignore: 'pid,hostname,service,environment,version,childName', errorLikeObjectKeys: ['err', 'error'], errorProps: 'message,stack,name,code', @@ -149,10 +156,23 @@ export class Logger { this.serviceName = serviceName; } + /** + * Check if a log level should be output based on global config + */ + private shouldLog(level: LogLevel): boolean { + const currentLevel = globalConfig.logLevel || 'info'; + return LOG_LEVELS[level] >= LOG_LEVELS[currentLevel]; + } + /** * Core log method */ private log(level: LogLevel, message: string | object, metadata?: LogMetadata): void { + // Skip if level is below current threshold + if (!this.shouldLog(level)) { + return; + } + const data = { ...this.context, ...metadata }; if (typeof message === 'string') { @@ -321,30 +341,7 @@ export async function shutdownLoggers(): Promise { logger.info('Logger shutting down...'); } - // Flush all loggers const flushPromises = Array.from(loggerCache.values()).map(logger => logger.flush()); - // return new Promise((resolve) => { - // // First try to flush if the method exists - // if (typeof logger.flush === 'function') { - // const timeout = setTimeout(() => { - // // eslint-disable-next-line no-console - // console.warn('Logger flush timeout after 100ms'); - // resolve(); - // }, 100); - - // logger.flush((err) => { - // clearTimeout(timeout); - // if (err) { - // // eslint-disable-next-line no-console - // console.error('Logger flush error:', err); - // } - // resolve(); - // }); - // } else { - // resolve(); - // } - // }); - // }); await Promise.all(flushPromises);