refactor: 替换服务端 console.log/error 为 winston logger

- folder-action.ts: 18处 console.log -> log.error
- auth-action.ts: 4处 console.error -> log.error
- dictionary-action/service.ts: 3处 -> log.error
- translator-action/service.ts: 3处 -> log.error
- bigmodel/translator/orchestrator.ts: console -> log.debug/info/error
- bigmodel/tts.ts: console -> log.error/warn
- bigmodel/dictionary/*.ts: console -> log.error/debug/info

客户端代码(browser、page.tsx)保留 console.error
This commit is contained in:
2026-03-08 14:58:43 +08:00
parent 0881846717
commit c01c94abd0
13 changed files with 100 additions and 76 deletions

View File

@@ -4,6 +4,9 @@ import { determineSemanticMapping } from "./stage2-semanticMapping";
import { generateStandardForm } from "./stage3-standardForm";
import { generateEntries } from "./stage4-entriesGeneration";
import { LookUpError } from "@/lib/errors";
import { createLogger } from "@/lib/logger";
const log = createLogger("dictionary-orchestrator");
export async function executeDictionaryLookup(
text: string,
@@ -11,35 +14,31 @@ export async function executeDictionaryLookup(
definitionLang: string
): Promise<ServiceOutputLookUp> {
try {
// ========== 阶段 1输入分析 ==========
console.log("[阶段1] 开始输入分析...");
log.debug("[Stage 1] Starting input analysis");
const analysis = await analyzeInput(text);
// 代码层面验证:输入是否有效
if (!analysis.isValid) {
console.log("[阶段1] 输入无效:", analysis.reason);
log.debug("[Stage 1] Invalid input", { reason: analysis.reason });
throw analysis.reason || "无效输入";
}
if (analysis.isEmpty) {
console.log("[阶段1] 输入为空");
log.debug("[Stage 1] Empty input");
throw "输入为空";
}
console.log("[阶段1] 输入分析完成:", analysis);
log.debug("[Stage 1] Analysis complete", { analysis });
// ========== 阶段 2语义映射 ==========
console.log("[阶段2] 开始语义映射...");
log.debug("[Stage 2] Starting semantic mapping");
const semanticMapping = await determineSemanticMapping(
text,
queryLang,
analysis.inputLanguage || text
);
console.log("[阶段2] 语义映射完成:", semanticMapping);
log.debug("[Stage 2] Semantic mapping complete", { semanticMapping });
// ========== 阶段 3生成标准形式 ==========
console.log("[阶段3] 开始生成标准形式...");
log.debug("[Stage 3] Generating standard form");
// 如果进行了语义映射,标准形式要基于映射后的结果
// 同时传递原始输入作为语义参考
@@ -52,16 +51,14 @@ export async function executeDictionaryLookup(
shouldUseMapping ? text : undefined // 如果进行了映射,传递原始输入作为语义参考
);
// 代码层面验证:标准形式不能为空
if (!standardFormResult.standardForm) {
console.error("[阶段3] 标准形式为空");
log.error("[Stage 3] Standard form is empty");
throw "无法生成标准形式";
}
console.log("[阶段3] 标准形式生成完成:", standardFormResult);
log.debug("[Stage 3] Standard form complete", { standardFormResult });
// ========== 阶段 4生成词条 ==========
console.log("[阶段4] 开始生成词条...");
log.debug("[Stage 4] Generating entries");
const entriesResult = await generateEntries(
standardFormResult.standardForm,
queryLang,
@@ -71,19 +68,18 @@ export async function executeDictionaryLookup(
: analysis.inputType
);
console.log("[阶段4] 词条生成完成:", entriesResult);
log.debug("[Stage 4] Entries complete", { entriesResult });
// ========== 组装最终结果 ==========
const finalResult: ServiceOutputLookUp = {
standardForm: standardFormResult.standardForm,
entries: entriesResult.entries,
};
console.log("[完成] 词典查询成功");
log.info("Dictionary lookup completed successfully");
return finalResult;
} catch (error) {
console.error("[错误] 词典查询失败:", error);
log.error("Dictionary lookup failed", { error });
const errorMessage = error instanceof Error ? error.message : "未知错误";
throw new LookUpError(errorMessage);

View File

@@ -1,6 +1,9 @@
import { getAnswer } from "../zhipu";
import { parseAIGeneratedJSON } from "@/utils/json";
import { InputAnalysisResult } from "./types";
import { createLogger } from "@/lib/logger";
const log = createLogger("dictionary-stage1");
/**
* 阶段 1输入解析与语言识别
@@ -59,7 +62,7 @@ export async function analyzeInput(text: string): Promise<InputAnalysisResult> {
return result;
} catch (error) {
console.error("阶段1失败", error);
log.error("Stage 1 failed", { error });
// 失败时抛出错误,包含 reason
throw new Error("输入分析失败:无法识别输入类型或语言");
}

View File

@@ -1,6 +1,9 @@
import { getAnswer } from "../zhipu";
import { parseAIGeneratedJSON } from "@/utils/json";
import { SemanticMappingResult } from "./types";
import { createLogger } from "@/lib/logger";
const log = createLogger("dictionary-stage2");
/**
* 阶段 2跨语言语义映射决策
@@ -99,7 +102,7 @@ b) 输入是明确、基础、可词典化的语义概念
reason: result.reason,
};
} catch (error) {
console.error("阶段2失败", error);
log.error("Stage 2 failed", { error });
// 失败时直接抛出错误,让编排器返回错误响应
throw error;
}

View File

@@ -1,6 +1,9 @@
import { getAnswer } from "../zhipu";
import { parseAIGeneratedJSON } from "@/utils/json";
import { StandardFormResult } from "./types";
import { createLogger } from "@/lib/logger";
const log = createLogger("dictionary-stage3");
/**
* 阶段 3standardForm 生成与规范化
@@ -90,7 +93,7 @@ ${originalInput ? `
reason,
};
} catch (error) {
console.error("阶段3失败", error);
log.error("Stage 3 failed", { error });
// 失败时抛出错误
throw error;
}

View File

@@ -1,6 +1,9 @@
import { getAnswer } from "../zhipu";
import { parseAIGeneratedJSON } from "@/utils/json";
import { EntriesGenerationResult } from "./types";
import { createLogger } from "@/lib/logger";
const log = createLogger("dictionary-stage4");
/**
* 阶段 4释义与词条生成
@@ -103,7 +106,7 @@ ${isWord ? `
return result;
} catch (error) {
console.error("阶段4失败", error);
log.error("Stage 4 failed", { error });
throw error; // 阶段4失败应该返回错误因为这个阶段是核心
}
}

View File

@@ -1,6 +1,9 @@
import { getAnswer } from "../zhipu";
import { parseAIGeneratedJSON } from "@/utils/json";
import { LanguageDetectionResult, TranslationLLMResponse } from "./types";
import { createLogger } from "@/lib/logger";
const log = createLogger("translator-orchestrator");
async function detectLanguage(text: string): Promise<LanguageDetectionResult> {
const prompt = `
@@ -40,7 +43,7 @@ async function detectLanguage(text: string): Promise<LanguageDetectionResult> {
return result;
} catch (error) {
console.error("Language detection failed:", error);
log.error("Language detection failed", { error });
throw new Error("Failed to detect source language");
}
}
@@ -82,7 +85,7 @@ async function performTranslation(
return result.trim();
} catch (error) {
console.error("Translation failed:", error);
log.error("Translation failed", { error });
throw new Error("Translation failed");
}
}
@@ -121,7 +124,7 @@ async function generateIPA(
return result.trim();
} catch (error) {
console.error("IPA generation failed:", error);
log.error("IPA generation failed", { error });
return "";
}
}
@@ -132,24 +135,19 @@ export async function executeTranslation(
needIpa: boolean
): Promise<TranslationLLMResponse> {
try {
console.log("[翻译] 开始翻译流程...");
console.log("[翻译] 源文本:", sourceText);
console.log("[翻译] 目标语言:", targetLanguage);
console.log("[翻译] 需要 IPA:", needIpa);
log.debug("Starting translation", { sourceText, targetLanguage, needIpa });
// Stage 1: Detect source language
console.log("[阶段1] 检测源语言...");
log.debug("[Stage 1] Detecting source language");
const detectionResult = await detectLanguage(sourceText);
console.log("[阶段1] 检测结果:", detectionResult);
log.debug("[Stage 1] Detection result", { detectionResult });
// Stage 2: Perform translation
console.log("[阶段2] 执行翻译...");
log.debug("[Stage 2] Performing translation");
const translatedText = await performTranslation(
sourceText,
detectionResult.sourceLanguage,
targetLanguage
);
console.log("[阶段2] 翻译完成:", translatedText);
log.debug("[Stage 2] Translation complete", { translatedText });
// Validate translation result
if (!translatedText) {
@@ -161,12 +159,12 @@ export async function executeTranslation(
let targetIpa: string | undefined;
if (needIpa) {
console.log("[阶段3] 生成 IPA...");
log.debug("[Stage 3] Generating IPA");
sourceIpa = await generateIPA(sourceText, detectionResult.sourceLanguage);
console.log("[阶段3] 源文本 IPA:", sourceIpa);
log.debug("[Stage 3] Source IPA", { sourceIpa });
targetIpa = await generateIPA(translatedText, targetLanguage);
console.log("[阶段3] 目标文本 IPA:", targetIpa);
log.debug("[Stage 3] Target IPA", { targetIpa });
}
// Assemble final result
@@ -179,10 +177,10 @@ export async function executeTranslation(
targetIpa,
};
console.log("[完成] 翻译流程成功");
log.info("Translation completed successfully");
return finalResult;
} catch (error) {
console.error("[错误] 翻译失败:", error);
log.error("Translation failed", { error });
const errorMessage = error instanceof Error ? error.message : "未知错误";
throw new Error(errorMessage);
}

View File

@@ -1,5 +1,9 @@
"use server";
import { createLogger } from "@/lib/logger";
const log = createLogger("tts");
// ==================== 类型定义 ====================
/**
@@ -147,7 +151,7 @@ class QwenTTSService {
return data;
} catch (error) {
console.error('语音合成请求失败:', error);
log.error("TTS request failed", { error });
throw error;
}
}
@@ -157,11 +161,7 @@ export type TTS_SUPPORTED_LANGUAGES = 'Auto' | 'Chinese' | 'English' | 'German'
export async function getTTSUrl(text: string, lang: TTS_SUPPORTED_LANGUAGES) {
try {
if (!process.env.DASHSCORE_API_KEY) {
console.warn(
`⚠️ 环境变量 DASHSCORE_API_KEY 未设置\n` +
` 请在 .env 文件中设置或直接传入API Key\n` +
` 获取API Key: https://help.aliyun.com/zh/model-studio/get-api-key`
);
log.warn("DASHSCORE_API_KEY not set");
throw "API Key设置错误";
}
const ttsService = new QwenTTSService(
@@ -176,7 +176,7 @@ export async function getTTSUrl(text: string, lang: TTS_SUPPORTED_LANGUAGES) {
);
return result.output.audio.url;
} catch (error) {
console.error('TTS合成失败:', error instanceof Error ? error.message : error);
log.error("TTS synthesis failed", { error: error instanceof Error ? error.message : error });
return "error";
}
}