From 37ed4b83b26151d56b0f931eedb5a6fa06acd9b1 Mon Sep 17 00:00:00 2001 From: Your Name Date: Wed, 27 May 2026 13:12:05 +0800 Subject: [PATCH] chore: govern layer split logging --- app/api/layer-split/route.ts | 5 +++- lib/ai/layer-split/service.ts | 52 ++++++++++++++++++++++++++++++++--- scripts/check-log-hygiene.mjs | 2 ++ 3 files changed, 54 insertions(+), 5 deletions(-) diff --git a/app/api/layer-split/route.ts b/app/api/layer-split/route.ts index 867f99f74..9c11f6385 100644 --- a/app/api/layer-split/route.ts +++ b/app/api/layer-split/route.ts @@ -1,6 +1,9 @@ import { NextRequest, NextResponse } from "next/server"; import { auth } from "@/app/(auth)/auth"; import { executeLayerSplitJob, LayerSplitServiceError } from "@/lib/ai/layer-split/service"; +import { createLogger } from "@/lib/observability/logger"; + +const logger = createLogger("layer-split-api"); export const runtime = "nodejs"; export const maxDuration = 300; @@ -51,7 +54,7 @@ export async function POST(request: NextRequest) { ); } - console.error("[LayerSplit API] 处理错误:", error); + logger.error("request_failed", error); return NextResponse.json( { error: "服务器内部错误", detail: error instanceof Error ? error.message : "未知错误" }, { status: 500 } diff --git a/lib/ai/layer-split/service.ts b/lib/ai/layer-split/service.ts index b5b7c7fb8..5b5d80dbe 100644 --- a/lib/ai/layer-split/service.ts +++ b/lib/ai/layer-split/service.ts @@ -1,12 +1,20 @@ import "server-only"; import JSZip from "jszip"; -import { createMediaAssetRelation, getMediaAssetsByUserAndUrls, getSystemSetting, upsertMediaAsset } from "@/lib/db/queries"; +import { + createMediaAssetRelation, + getMediaAssetsByUserAndUrls, + getSystemSetting, + upsertMediaAsset, +} from "@/lib/db/queries"; import { db } from "@/lib/db"; import { generatedImage } from "@/lib/db/schema"; +import { createLogger } from "@/lib/observability/logger"; import { ensurePublicImageUrl } from "@/lib/realtime/image-input"; import { uploadFile } from "@/lib/storage/service"; +const logger = createLogger("layer-split-service"); + const LAYER_SPLIT_CONFIG_KEY = "layer_split_config"; const DEFAULT_REPLICATE_BASE_URL = "https://api.replicate.com/v1"; const DEFAULT_LAYER_SPLIT_MODEL = "qwen/qwen-image-layered"; @@ -443,7 +451,7 @@ async function createThumbnail(buffer: Buffer, mimeType: string): Promise { const startedAt = Date.now(); const config = await getValidatedLayerSplitConfig(); + logger.info("job_started", { + hasChatId: Boolean(params.chatId), + hasMessageId: Boolean(params.messageId), + hasPrompt: Boolean(params.prompt), + hasSourceNodeId: Boolean(params.sourceNodeId), + skipGallerySave: Boolean(params.skipGallerySave), + }); const normalizedImageUrl = await ensurePublicImageUrl({ imageUrl: params.imageUrl, prefix: "layer-split-input", @@ -630,6 +663,10 @@ export async function executeLayerSplitJob(params: LayerSplitParams): Promise