From 756918b0ce2f843e8b3cb411d4e975270af1a1fb Mon Sep 17 00:00:00 2001 From: Edric Li Date: Tue, 9 Sep 2025 02:45:47 +0800 Subject: [PATCH 1/3] =?UTF-8?q?feat:=20=E5=9C=A8=E9=94=99=E8=AF=AF?= =?UTF-8?q?=E6=97=A5=E5=BF=97=E4=B8=AD=E6=B7=BB=E5=8A=A0=E8=B4=A6=E5=8F=B7?= =?UTF-8?q?=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在 claudeRelayService.js 的所有错误日志中添加账号名称或 ID - 在 claudeConsoleRelayService.js 的错误日志中添加账号信息 - 便于排查 529 (过载) 和 504 (超时) 错误对应的具体账号 问题背景: 用户反馈错误日志中没有账号信息,无法定位是哪个账号出现问题, 特别是 529 和 504 错误频繁出现时难以排查。 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude --- src/services/claudeConsoleRelayService.js | 12 ++++++------ src/services/claudeRelayService.js | 20 ++++++++++---------- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/src/services/claudeConsoleRelayService.js b/src/services/claudeConsoleRelayService.js index 61e4f2f3..1e040ee9 100644 --- a/src/services/claudeConsoleRelayService.js +++ b/src/services/claudeConsoleRelayService.js @@ -222,7 +222,7 @@ class ClaudeConsoleRelayService { throw new Error('Client disconnected') } - logger.error('❌ Claude Console Claude relay request failed:', error.message) + logger.error(`❌ Claude Console relay request failed (Account: ${account?.name || accountId}):`, error.message) // 不再因为模型不支持而block账号 @@ -297,7 +297,7 @@ class ClaudeConsoleRelayService { // 更新最后使用时间 await this._updateLastUsedTime(accountId) } catch (error) { - logger.error('❌ Claude Console Claude stream relay failed:', error) + logger.error(`❌ Claude Console stream relay failed (Account: ${account?.name || accountId}):`, error) throw error } } @@ -376,7 +376,7 @@ class ClaudeConsoleRelayService { // 错误响应处理 if (response.status !== 200) { - logger.error(`❌ Claude Console API returned error status: ${response.status}`) + logger.error(`❌ Claude Console API returned error status: ${response.status} | Account: ${account?.name || accountId}`) if (response.status === 401) { claudeConsoleAccountService.markAccountUnauthorized(accountId) @@ -528,7 +528,7 @@ class ClaudeConsoleRelayService { } } } catch (error) { - logger.error('❌ Error processing Claude Console stream data:', error) + logger.error(`❌ Error processing Claude Console stream data (Account: ${account?.name || accountId}):`, error) if (!responseStream.destroyed) { responseStream.write('event: error\n') responseStream.write( @@ -570,7 +570,7 @@ class ClaudeConsoleRelayService { }) response.data.on('error', (error) => { - logger.error('❌ Claude Console stream error:', error) + logger.error(`❌ Claude Console stream error (Account: ${account?.name || accountId}):`, error) if (!responseStream.destroyed) { responseStream.write('event: error\n') responseStream.write( @@ -590,7 +590,7 @@ class ClaudeConsoleRelayService { return } - logger.error('❌ Claude Console Claude stream request error:', error.message) + logger.error(`❌ Claude Console stream request error (Account: ${account?.name || accountId}):`, error.message) // 检查错误状态 if (error.response) { diff --git a/src/services/claudeRelayService.js b/src/services/claudeRelayService.js index f4e03334..577c6236 100644 --- a/src/services/claudeRelayService.js +++ b/src/services/claudeRelayService.js @@ -741,7 +741,7 @@ class ClaudeRelayService { resolve(response) } catch (error) { - logger.error('❌ Failed to parse Claude API response:', error) + logger.error(`❌ Failed to parse Claude API response (Account: ${accountId}):`, error) reject(error) } }) @@ -754,7 +754,7 @@ class ClaudeRelayService { req.on('error', async (error) => { console.error(': ❌ ', error) - logger.error('❌ Claude API request error:', error.message, { + logger.error(`❌ Claude API request error (Account: ${accountId}):`, error.message, { code: error.code, errno: error.errno, syscall: error.syscall, @@ -781,7 +781,7 @@ class ClaudeRelayService { req.on('timeout', async () => { req.destroy() - logger.error('❌ Claude API request timeout') + logger.error(`❌ Claude API request timeout (Account: ${accountId})`) await this._handleServerError(accountId, 504, null, 'Request') @@ -889,7 +889,7 @@ class ClaudeRelayService { options ) } catch (error) { - logger.error('❌ Claude stream relay with usage capture failed:', error) + logger.error(`❌ Claude stream relay with usage capture failed:`, error) throw error } } @@ -1015,7 +1015,7 @@ class ClaudeRelayService { logger.error('❌ Error in stream error handler:', err) }) - logger.error(`❌ Claude API returned error status: ${res.statusCode}`) + logger.error(`❌ Claude API returned error status: ${res.statusCode} | Account: ${account?.name || accountId}`) let errorData = '' res.on('data', (chunk) => { @@ -1024,7 +1024,7 @@ class ClaudeRelayService { res.on('end', () => { console.error(': ❌ ', errorData) - logger.error('❌ Claude API error response:', errorData) + logger.error(`❌ Claude API error response (Account: ${account?.name || accountId}):`, errorData) if (!responseStream.destroyed) { // 发送错误事件 responseStream.write('event: error\n') @@ -1343,7 +1343,7 @@ class ClaudeRelayService { }) req.on('error', async (error) => { - logger.error('❌ Claude stream request error:', error.message, { + logger.error(`❌ Claude stream request error (Account: ${account?.name || accountId}):`, error.message, { code: error.code, errno: error.errno, syscall: error.syscall @@ -1391,7 +1391,7 @@ class ClaudeRelayService { req.on('timeout', async () => { req.destroy() - logger.error('❌ Claude stream request timeout') + logger.error(`❌ Claude stream request timeout | Account: ${account?.name || accountId}`) if (!responseStream.headersSent) { responseStream.writeHead(504, { @@ -1493,7 +1493,7 @@ class ClaudeRelayService { }) req.on('error', async (error) => { - logger.error('❌ Claude stream request error:', error.message, { + logger.error(`❌ Claude stream request error (Account: ${account?.name || accountId}):`, error.message, { code: error.code, errno: error.errno, syscall: error.syscall @@ -1541,7 +1541,7 @@ class ClaudeRelayService { req.on('timeout', async () => { req.destroy() - logger.error('❌ Claude stream request timeout') + logger.error(`❌ Claude stream request timeout | Account: ${account?.name || accountId}`) if (!responseStream.headersSent) { responseStream.writeHead(504, { From 52820a7e49789142c89a4e8143bfdc1c26153eed Mon Sep 17 00:00:00 2001 From: Edric Li Date: Tue, 9 Sep 2025 04:14:27 +0800 Subject: [PATCH 2/3] =?UTF-8?q?style:=20=E4=BF=AE=E5=A4=8D=20Prettier=20?= =?UTF-8?q?=E6=A0=BC=E5=BC=8F=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 格式化 src/app.js - 格式化 src/services/claudeConsoleRelayService.js - 格式化 src/services/claudeRelayService.js --- src/app.js | 4 +-- src/services/claudeConsoleRelayService.js | 29 ++++++++++++++---- src/services/claudeRelayService.js | 37 +++++++++++++++-------- 3 files changed, 50 insertions(+), 20 deletions(-) diff --git a/src/app.js b/src/app.js index 67f26bfe..a1f06b36 100644 --- a/src/app.js +++ b/src/app.js @@ -537,7 +537,7 @@ class Application { logger.info( `🔄 Cleanup tasks scheduled every ${config.system.cleanupInterval / 1000 / 60} minutes` ) - + // 🚨 启动限流状态自动清理服务 // 每5分钟检查一次过期的限流状态,确保账号能及时恢复调度 const rateLimitCleanupService = require('./services/rateLimitCleanupService') @@ -563,7 +563,7 @@ class Application { } catch (error) { logger.error('❌ Error cleaning up pricing service:', error) } - + // 停止限流清理服务 try { const rateLimitCleanupService = require('./services/rateLimitCleanupService') diff --git a/src/services/claudeConsoleRelayService.js b/src/services/claudeConsoleRelayService.js index 1e040ee9..6a88166d 100644 --- a/src/services/claudeConsoleRelayService.js +++ b/src/services/claudeConsoleRelayService.js @@ -222,7 +222,10 @@ class ClaudeConsoleRelayService { throw new Error('Client disconnected') } - logger.error(`❌ Claude Console relay request failed (Account: ${account?.name || accountId}):`, error.message) + logger.error( + `❌ Claude Console relay request failed (Account: ${account?.name || accountId}):`, + error.message + ) // 不再因为模型不支持而block账号 @@ -297,7 +300,10 @@ class ClaudeConsoleRelayService { // 更新最后使用时间 await this._updateLastUsedTime(accountId) } catch (error) { - logger.error(`❌ Claude Console stream relay failed (Account: ${account?.name || accountId}):`, error) + logger.error( + `❌ Claude Console stream relay failed (Account: ${account?.name || accountId}):`, + error + ) throw error } } @@ -376,7 +382,9 @@ class ClaudeConsoleRelayService { // 错误响应处理 if (response.status !== 200) { - logger.error(`❌ Claude Console API returned error status: ${response.status} | Account: ${account?.name || accountId}`) + logger.error( + `❌ Claude Console API returned error status: ${response.status} | Account: ${account?.name || accountId}` + ) if (response.status === 401) { claudeConsoleAccountService.markAccountUnauthorized(accountId) @@ -528,7 +536,10 @@ class ClaudeConsoleRelayService { } } } catch (error) { - logger.error(`❌ Error processing Claude Console stream data (Account: ${account?.name || accountId}):`, error) + logger.error( + `❌ Error processing Claude Console stream data (Account: ${account?.name || accountId}):`, + error + ) if (!responseStream.destroyed) { responseStream.write('event: error\n') responseStream.write( @@ -570,7 +581,10 @@ class ClaudeConsoleRelayService { }) response.data.on('error', (error) => { - logger.error(`❌ Claude Console stream error (Account: ${account?.name || accountId}):`, error) + logger.error( + `❌ Claude Console stream error (Account: ${account?.name || accountId}):`, + error + ) if (!responseStream.destroyed) { responseStream.write('event: error\n') responseStream.write( @@ -590,7 +604,10 @@ class ClaudeConsoleRelayService { return } - logger.error(`❌ Claude Console stream request error (Account: ${account?.name || accountId}):`, error.message) + logger.error( + `❌ Claude Console stream request error (Account: ${account?.name || accountId}):`, + error.message + ) // 检查错误状态 if (error.response) { diff --git a/src/services/claudeRelayService.js b/src/services/claudeRelayService.js index 577c6236..658391b8 100644 --- a/src/services/claudeRelayService.js +++ b/src/services/claudeRelayService.js @@ -1015,7 +1015,9 @@ class ClaudeRelayService { logger.error('❌ Error in stream error handler:', err) }) - logger.error(`❌ Claude API returned error status: ${res.statusCode} | Account: ${account?.name || accountId}`) + logger.error( + `❌ Claude API returned error status: ${res.statusCode} | Account: ${account?.name || accountId}` + ) let errorData = '' res.on('data', (chunk) => { @@ -1024,7 +1026,10 @@ class ClaudeRelayService { res.on('end', () => { console.error(': ❌ ', errorData) - logger.error(`❌ Claude API error response (Account: ${account?.name || accountId}):`, errorData) + logger.error( + `❌ Claude API error response (Account: ${account?.name || accountId}):`, + errorData + ) if (!responseStream.destroyed) { // 发送错误事件 responseStream.write('event: error\n') @@ -1343,11 +1348,15 @@ class ClaudeRelayService { }) req.on('error', async (error) => { - logger.error(`❌ Claude stream request error (Account: ${account?.name || accountId}):`, error.message, { - code: error.code, - errno: error.errno, - syscall: error.syscall - }) + logger.error( + `❌ Claude stream request error (Account: ${account?.name || accountId}):`, + error.message, + { + code: error.code, + errno: error.errno, + syscall: error.syscall + } + ) // 根据错误类型提供更具体的错误信息 let errorMessage = 'Upstream request failed' @@ -1493,11 +1502,15 @@ class ClaudeRelayService { }) req.on('error', async (error) => { - logger.error(`❌ Claude stream request error (Account: ${account?.name || accountId}):`, error.message, { - code: error.code, - errno: error.errno, - syscall: error.syscall - }) + logger.error( + `❌ Claude stream request error (Account: ${account?.name || accountId}):`, + error.message, + { + code: error.code, + errno: error.errno, + syscall: error.syscall + } + ) // 根据错误类型提供更具体的错误信息 let errorMessage = 'Upstream request failed' From f375f9f841ebae9cb1867bd92c669c70619e7001 Mon Sep 17 00:00:00 2001 From: Edric Li Date: Tue, 9 Sep 2025 11:10:27 +0800 Subject: [PATCH 3/3] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=20ESLint=20?= =?UTF-8?q?=E9=94=99=E8=AF=AF=20-=20=E8=A7=A3=E5=86=B3=E6=9C=AA=E5=AE=9A?= =?UTF-8?q?=E4=B9=89=E5=8F=98=E9=87=8F=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - claudeConsoleRelayService.js: 将 account 变量声明提到更高作用域 - claudeRelayService.js: 移除 _makeClaudeStreamRequest 函数中的未定义变量引用 --- src/services/claudeConsoleRelayService.js | 6 ++++-- src/services/claudeRelayService.js | 16 ++++++---------- 2 files changed, 10 insertions(+), 12 deletions(-) diff --git a/src/services/claudeConsoleRelayService.js b/src/services/claudeConsoleRelayService.js index 6a88166d..6b97c881 100644 --- a/src/services/claudeConsoleRelayService.js +++ b/src/services/claudeConsoleRelayService.js @@ -19,10 +19,11 @@ class ClaudeConsoleRelayService { options = {} ) { let abortController = null + let account = null try { // 获取账户信息 - const account = await claudeConsoleAccountService.getAccount(accountId) + account = await claudeConsoleAccountService.getAccount(accountId) if (!account) { throw new Error('Claude Console Claude account not found') } @@ -244,9 +245,10 @@ class ClaudeConsoleRelayService { streamTransformer = null, options = {} ) { + let account = null try { // 获取账户信息 - const account = await claudeConsoleAccountService.getAccount(accountId) + account = await claudeConsoleAccountService.getAccount(accountId) if (!account) { throw new Error('Claude Console Claude account not found') } diff --git a/src/services/claudeRelayService.js b/src/services/claudeRelayService.js index 658391b8..ac80cc6a 100644 --- a/src/services/claudeRelayService.js +++ b/src/services/claudeRelayService.js @@ -1502,15 +1502,11 @@ class ClaudeRelayService { }) req.on('error', async (error) => { - logger.error( - `❌ Claude stream request error (Account: ${account?.name || accountId}):`, - error.message, - { - code: error.code, - errno: error.errno, - syscall: error.syscall - } - ) + logger.error(`❌ Claude stream request error:`, error.message, { + code: error.code, + errno: error.errno, + syscall: error.syscall + }) // 根据错误类型提供更具体的错误信息 let errorMessage = 'Upstream request failed' @@ -1554,7 +1550,7 @@ class ClaudeRelayService { req.on('timeout', async () => { req.destroy() - logger.error(`❌ Claude stream request timeout | Account: ${account?.name || accountId}`) + logger.error(`❌ Claude stream request timeout`) if (!responseStream.headersSent) { responseStream.writeHead(504, {