From 4aa562be21aa6b08ddfed9e3f65f0bc7ebd65db2 Mon Sep 17 00:00:00 2001 From: shaw Date: Wed, 20 Aug 2025 21:45:24 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E5=8E=BB=E9=99=A4logger=E8=87=AA?= =?UTF-8?q?=E5=8A=A8=E6=B7=BB=E5=8A=A0metadata=E5=AD=97=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/routes/geminiRoutes.js | 22 +++++++++++++++++-- src/routes/openaiRoutes.js | 7 +++--- src/utils/logger.js | 13 ++++------- .../src/components/accounts/AccountForm.vue | 4 ++-- 4 files changed, 30 insertions(+), 16 deletions(-) diff --git a/src/routes/geminiRoutes.js b/src/routes/geminiRoutes.js index ce6ea479..88255b35 100644 --- a/src/routes/geminiRoutes.js +++ b/src/routes/geminiRoutes.js @@ -573,7 +573,16 @@ async function handleGenerateContent(req, res) { res.json(response) } catch (error) { const version = req.path.includes('v1beta') ? 'v1beta' : 'v1internal' - logger.error(`Error in generateContent endpoint (${version})`, { error: error.message }) + // 打印详细的错误信息 + logger.error(`Error in generateContent endpoint (${version})`, { + message: error.message, + status: error.response?.status, + statusText: error.response?.statusText, + responseData: error.response?.data, + requestUrl: error.config?.url, + requestMethod: error.config?.method, + stack: error.stack + }) res.status(500).json({ error: { message: error.message || 'Internal server error', @@ -756,7 +765,16 @@ async function handleStreamGenerateContent(req, res) { }) } catch (error) { const version = req.path.includes('v1beta') ? 'v1beta' : 'v1internal' - logger.error(`Error in streamGenerateContent endpoint (${version})`, { error: error.message }) + // 打印详细的错误信息 + logger.error(`Error in streamGenerateContent endpoint (${version})`, { + message: error.message, + status: error.response?.status, + statusText: error.response?.statusText, + responseData: error.response?.data, + requestUrl: error.config?.url, + requestMethod: error.config?.method, + stack: error.stack + }) if (!res.headersSent) { res.status(500).json({ diff --git a/src/routes/openaiRoutes.js b/src/routes/openaiRoutes.js index 2e6ff9f0..7a0c9692 100644 --- a/src/routes/openaiRoutes.js +++ b/src/routes/openaiRoutes.js @@ -82,7 +82,8 @@ async function getOpenAIAuthToken(apiKeyData, sessionId = null, requestedModel = accessToken, accountId: result.accountId, accountName: account.name, - proxy + proxy, + account } } catch (error) { logger.error('Failed to get OpenAI auth token:', error) @@ -148,7 +149,7 @@ router.post('/responses', authenticateApiKey, async (req, res) => { } // 使用调度器选择账户 - const { accessToken, accountId, proxy } = await getOpenAIAuthToken( + const { accessToken, accountId, accountName, proxy, account } = await getOpenAIAuthToken( apiKeyData, sessionId, requestedModel @@ -167,7 +168,7 @@ router.post('/responses', authenticateApiKey, async (req, res) => { // 覆盖或新增必要头部 headers['authorization'] = `Bearer ${accessToken}` - headers['chatgpt-account-id'] = accountId + headers['chatgpt-account-id'] = account.chatgptUserId || account.accountId || accountId headers['host'] = 'chatgpt.com' headers['accept'] = isStream ? 'text/event-stream' : 'application/json' headers['content-type'] = 'application/json' diff --git a/src/utils/logger.js b/src/utils/logger.js index 9de2ec8f..97a345bc 100644 --- a/src/utils/logger.js +++ b/src/utils/logger.js @@ -60,8 +60,8 @@ const safeStringify = (obj, maxDepth = 3, fullDepth = false) => { const createLogFormat = (colorize = false) => { const formats = [ winston.format.timestamp({ format: 'YYYY-MM-DD HH:mm:ss' }), - winston.format.errors({ stack: true }), - winston.format.metadata({ fillExcept: ['message', 'level', 'timestamp', 'stack'] }) + winston.format.errors({ stack: true }) + // 移除 winston.format.metadata() 来避免自动包装 ] if (colorize) { @@ -69,7 +69,7 @@ const createLogFormat = (colorize = false) => { } formats.push( - winston.format.printf(({ level, message, timestamp, stack, metadata, ...rest }) => { + winston.format.printf(({ level, message, timestamp, stack, ...rest }) => { const emoji = { error: '❌', warn: '⚠️ ', @@ -80,12 +80,7 @@ const createLogFormat = (colorize = false) => { let logMessage = `${emoji[level] || '📝'} [${timestamp}] ${level.toUpperCase()}: ${message}` - // 添加元数据 - if (metadata && Object.keys(metadata).length > 0) { - logMessage += ` | ${safeStringify(metadata)}` - } - - // 添加其他属性 + // 直接处理额外数据,不需要metadata包装 const additionalData = { ...rest } delete additionalData.level delete additionalData.message diff --git a/web/admin-spa/src/components/accounts/AccountForm.vue b/web/admin-spa/src/components/accounts/AccountForm.vue index 661bc7f4..625d712f 100644 --- a/web/admin-spa/src/components/accounts/AccountForm.vue +++ b/web/admin-spa/src/components/accounts/AccountForm.vue @@ -2081,8 +2081,8 @@ const updateAccount = async () => { } } - if (props.account.platform === 'gemini' && form.value.projectId) { - data.projectId = form.value.projectId + if (props.account.platform === 'gemini') { + data.projectId = form.value.projectId || '' } // Claude 官方账号优先级和订阅类型更新