From 069cf105f3412db36a2002962262afe7461d49b1 Mon Sep 17 00:00:00 2001 From: MythEclipse Date: Mon, 18 May 2026 23:48:02 +0700 Subject: [PATCH] fix: enhance error logging with additional context in analysis and moderation processes --- src/moderation/aiAnalysisWorker.ts | 13 +++++++++++++ src/moderation/aiAnalyzer.ts | 20 ++++++++++++++++++-- src/moderation/llmModerationClient.ts | 13 +++++++++---- 3 files changed, 40 insertions(+), 6 deletions(-) diff --git a/src/moderation/aiAnalysisWorker.ts b/src/moderation/aiAnalysisWorker.ts index b08363a..d9dfdd0 100644 --- a/src/moderation/aiAnalysisWorker.ts +++ b/src/moderation/aiAnalysisWorker.ts @@ -95,8 +95,21 @@ async function processAnalysisRequest({ return { ok: true, conversationKey, rows }; } catch (error) { const errorMessage = error instanceof Error ? error.message : String(error); + const errorStack = error instanceof Error ? error.stack : undefined; const rows: MessageRecord[] = []; + console.error( + JSON.stringify({ + level: "ERROR", + context: "aiAnalysisWorker", + conversationKey, + messageCount: messages.length, + error: errorMessage, + stack: errorStack, + timestamp: new Date().toISOString(), + }), + ); + return { ok: false, conversationKey, rows, error: errorMessage }; } } diff --git a/src/moderation/aiAnalyzer.ts b/src/moderation/aiAnalyzer.ts index 366b0d3..8203971 100644 --- a/src/moderation/aiAnalyzer.ts +++ b/src/moderation/aiAnalyzer.ts @@ -102,7 +102,14 @@ async function processBatch( Date.now() + ERROR_COOLDOWN_MS, ); logger.error( - { conversationKey, error: lastError }, + { + conversationKey, + error: lastError, + messageCount: messages.length, + messageIds: messages.map((m) => m.id), + cooldownUntil: new Date(Date.now() + ERROR_COOLDOWN_MS).toISOString(), + timestamp: new Date().toISOString(), + }, "Batch analysis failed, will retry after cooldown", ); return; @@ -111,12 +118,21 @@ async function processBatch( conversationErrorCooldown.delete(conversationKey); } catch (error) { lastError = error instanceof Error ? error.message : String(error); + const errorStack = error instanceof Error ? error.stack : undefined; conversationErrorCooldown.set( conversationKey, Date.now() + ERROR_COOLDOWN_MS, ); logger.error( - { conversationKey, error: lastError }, + { + conversationKey, + error: lastError, + stack: errorStack, + messageCount: messages.length, + messageIds: messages.map((m) => m.id), + cooldownUntil: new Date(Date.now() + ERROR_COOLDOWN_MS).toISOString(), + timestamp: new Date().toISOString(), + }, "Analysis worker failed, will retry after cooldown", ); } finally { diff --git a/src/moderation/llmModerationClient.ts b/src/moderation/llmModerationClient.ts index fb4e487..602adb0 100644 --- a/src/moderation/llmModerationClient.ts +++ b/src/moderation/llmModerationClient.ts @@ -529,11 +529,16 @@ Return ONLY valid JSON, no other text.`; try { parsed = parseModerationResponse(content, targetIds); } catch (parseError) { + const errorMsg = parseError instanceof Error ? parseError.message : String(parseError); log.error( { - error: - parseError instanceof Error ? parseError.message : String(parseError), - content, + error: errorMsg, + contentLength: content.length, + contentPreview: content.substring(0, 500), + fullContent: content, + targetIds, + model: config.AI_LLM_MODEL, + timestamp: new Date().toISOString(), }, "Robust Fallback: Failed to parse moderation response. Defaulting all targets to clean.", ); @@ -542,7 +547,7 @@ Return ONLY valid JSON, no other text.`; status: "clean", flags: [], score: 0.1, - analysis: `Parsing failed: ${parseError instanceof Error ? parseError.message : String(parseError)}. Defaulted to clean.`, + analysis: `Parsing failed: ${errorMsg}. Defaulted to clean.`, })); }