From 617a3617134b481d63bb31048d3268ee7f8ea045 Mon Sep 17 00:00:00 2001 From: kjqwer <2990346238@qq.com> Date: Sat, 27 Sep 2025 16:18:43 +0800 Subject: [PATCH] =?UTF-8?q?=E6=97=A5=E5=BF=97=E6=98=BE=E7=A4=BA=E6=9B=B4?= =?UTF-8?q?=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/middleware/logger.js | 78 ++++++++++++++++++++------------- backend/server.js | 18 ++++---- backend/services/image-cache.js | 2 +- backend/start.js | 26 +++++------ backend/utils/logger.js | 23 +++++----- scripts/create-portable.js | 8 ++-- start.bat | 16 +++---- 7 files changed, 94 insertions(+), 77 deletions(-) diff --git a/backend/middleware/logger.js b/backend/middleware/logger.js index 790d642..822be0f 100644 --- a/backend/middleware/logger.js +++ b/backend/middleware/logger.js @@ -3,6 +3,33 @@ */ const { defaultLogger } = require('../utils/logger'); +// 颜色常量 +const METHOD_COLORS = { + GET: '\x1b[32m', // 绿色 + POST: '\x1b[34m', // 蓝色 + PUT: '\x1b[33m', // 黄色 + DELETE: '\x1b[31m', // 红色 + PATCH: '\x1b[35m', // 紫色 + DEFAULT: '\x1b[37m' // 白色 +}; + +// 状态码颜色 +const STATUS_COLORS = { + SUCCESS: '\x1b[32m', // 2xx - 绿色 + REDIRECT: '\x1b[36m', // 3xx - 青色 + CLIENT_ERROR: '\x1b[33m', // 4xx - 黄色 + SERVER_ERROR: '\x1b[31m' // 5xx - 红色 +}; + +// 响应时间颜色 +const DURATION_COLORS = { + FAST: '\x1b[32m', // < 100ms - 绿色 + MEDIUM: '\x1b[33m', // < 500ms - 黄色 + SLOW: '\x1b[31m' // >= 500ms - 红色 +}; + +const RESET_COLOR = '\x1b[0m'; + // 创建logger实例 const logger = defaultLogger.child('API'); @@ -58,42 +85,33 @@ function loggerMiddleware(req, res, next) { const method = req.method; const url = req.originalUrl; - // 根据状态码选择图标 - let statusIcon; + // 获取方法颜色 + const methodColor = METHOD_COLORS[method] || METHOD_COLORS.DEFAULT; + + // 获取状态码颜色 + let statusColor; if (statusCode >= 200 && statusCode < 300) { - statusIcon = '✅'; + statusColor = STATUS_COLORS.SUCCESS; } else if (statusCode >= 300 && statusCode < 400) { - statusIcon = '🔄'; + statusColor = STATUS_COLORS.REDIRECT; } else if (statusCode >= 400 && statusCode < 500) { - statusIcon = '⚠️'; + statusColor = STATUS_COLORS.CLIENT_ERROR; } else { - statusIcon = '❌'; - } - - // 根据请求类型选择图标 - let methodIcon; - switch (method) { - case 'GET': - methodIcon = '📥'; - break; - case 'POST': - methodIcon = '📤'; - break; - case 'PUT': - methodIcon = '🔄'; - break; - case 'DELETE': - methodIcon = '🗑️'; - break; - case 'PATCH': - methodIcon = '🔧'; - break; - default: - methodIcon = '❓'; + statusColor = STATUS_COLORS.SERVER_ERROR; } - // 输出日志 - logger.info(`${statusIcon} ${methodIcon} ${method} ${url} ${statusCode} ${duration}ms`); + // 获取响应时间颜色 + let durationColor; + if (duration < 100) { + durationColor = DURATION_COLORS.FAST; + } else if (duration < 500) { + durationColor = DURATION_COLORS.MEDIUM; + } else { + durationColor = DURATION_COLORS.SLOW; + } + + // 输出彩色日志 + logger.info(`${methodColor}[${method}]${RESET_COLOR} ${url} ${statusColor}${statusCode}${RESET_COLOR} ${durationColor}${duration}ms${RESET_COLOR}`); // 调用原始的end方法 originalEnd.call(this, chunk, encoding); diff --git a/backend/server.js b/backend/server.js index f28857e..ac68906 100644 --- a/backend/server.js +++ b/backend/server.js @@ -34,7 +34,7 @@ class PixivServer { * 初始化服务器 */ async init() { - logger.info('🔧 正在初始化 Pixiv 后端服务器...'); + logger.info('正在初始化 Pixiv 后端服务器...'); // 重新设置端口(从环境变量获取) this.port = process.env.PORT || 3000; @@ -55,7 +55,7 @@ class PixivServer { // 配置错误处理 this.setupErrorHandling(); - logger.info('✅ 服务器初始化完成'); + logger.info('服务器初始化完成'); } /** @@ -99,12 +99,12 @@ class PixivServer { */ start() { this.app.listen(this.port, () => { - logger.info('✅ Pixiv 后端服务器已启动'); - logger.info(`📍 服务地址: http://localhost:${this.port}`); - logger.info(`🔗 健康检查: http://localhost:${this.port}/health`); - logger.info(`📊 登录状态: ${this.backend.isLoggedIn ? '已登录' : '未登录'}`); + logger.info('Pixiv 后端服务器已启动'); + logger.info(`服务地址: http://localhost:${this.port}`); + logger.info(`健康检查: http://localhost:${this.port}/health`); + logger.info(`登录状态: ${this.backend.isLoggedIn ? '已登录' : '未登录'}`); if (this.backend.isLoggedIn) { - logger.info(`👤 用户: ${this.backend.config.user?.account}`); + logger.info(`用户: ${this.backend.config.user?.account}`); } logger.info('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━'); }); @@ -114,10 +114,10 @@ class PixivServer { * 优雅关闭 */ async shutdown() { - logger.info('🔄 正在关闭服务器...'); + logger.info('正在关闭服务器...'); // 清理代理环境变量 proxyConfig.clearEnvironmentVariables(); - logger.info('✅ 服务器已关闭'); + logger.info('服务器已关闭'); process.exit(0); } } diff --git a/backend/services/image-cache.js b/backend/services/image-cache.js index 6a88646..08ecb96 100644 --- a/backend/services/image-cache.js +++ b/backend/services/image-cache.js @@ -90,7 +90,7 @@ class ImageCacheService { async ensureCacheDir() { try { await fs.mkdir(this.cacheDir, { recursive: true }); - logger.info('图片缓存目录创建成功', { cacheDir: this.cacheDir }); + logger.info('图片缓存目录创建成功'); } catch (error) { logger.error('创建图片缓存目录失败', error); } diff --git a/backend/start.js b/backend/start.js index d53f9d3..301e26c 100644 --- a/backend/start.js +++ b/backend/start.js @@ -64,49 +64,49 @@ process.env.NODE_ENV = process.env.NODE_ENV || 'development'; // 如果提供了代理端口,设置环境变量 if (cliOptions.proxyPort) { process.env.PROXY_PORT = cliOptions.proxyPort.toString(); - logger.info(`📡 代理端口已设置为: ${cliOptions.proxyPort}`); + logger.info(`代理端口已设置为: ${cliOptions.proxyPort}`); } // 如果提供了服务器端口,设置环境变量 if (cliOptions.serverPort) { process.env.PORT = cliOptions.serverPort.toString(); - logger.info(`🌐 服务器端口已设置为: ${cliOptions.serverPort}`); + logger.info(`服务器端口已设置为: ${cliOptions.serverPort}`); } -logger.info('🚀 启动 Pixiv 后端服务器...'); +logger.info('启动 Pixiv 后端服务器...'); // 创建服务器实例 const server = new PixivServer(); // 处理进程信号 process.on('SIGINT', async () => { - logger.info('🛑 收到 SIGINT 信号,正在关闭服务器...'); + logger.info('收到 SIGINT 信号,正在关闭服务器...'); await server.shutdown(); }); process.on('SIGTERM', async () => { - logger.info('🛑 收到 SIGTERM 信号,正在关闭服务器...'); + logger.info('收到 SIGTERM 信号,正在关闭服务器...'); await server.shutdown(); }); // 处理未捕获的异常 process.on('uncaughtException', error => { - logger.error('❌ 未捕获的异常', error); - logger.error('❌ 异常堆栈:', error.stack); + logger.error('未捕获的异常', error); + logger.error('异常堆栈:', error.stack); process.exit(1); }); process.on('unhandledRejection', (reason, promise) => { - logger.error('❌ 未处理的 Promise 拒绝'); - logger.error('❌ 拒绝原因:', reason); + logger.error('未处理的 Promise 拒绝'); + logger.error('拒绝原因:', reason); if (reason instanceof Error) { - logger.error('❌ 错误堆栈:', reason.stack); + logger.error('错误堆栈:', reason.stack); } - logger.error('❌ Promise:', promise); + logger.error('Promise:', promise); // 不要立即退出进程,而是记录错误并继续运行 // 这样可以避免因为自动恢复任务的小错误而停止整个服务 - logger.warn('⚠️ 继续运行服务器,但建议检查上述错误'); + logger.warn('继续运行服务器,但建议检查上述错误'); }); // 启动服务器 @@ -114,6 +114,6 @@ server .init() .then(() => server.start()) .catch(error => { - logger.error('❌ 服务器启动失败', error); + logger.error('服务器启动失败', error); process.exit(1); }); diff --git a/backend/utils/logger.js b/backend/utils/logger.js index 26a0956..0d62a2c 100644 --- a/backend/utils/logger.js +++ b/backend/utils/logger.js @@ -39,6 +39,7 @@ const LogLevelColors = { */ const ModuleColors = { 'Server': '\x1b[32m', // 绿色 + 'API': '\x1b[32m', // 绿色 'Start': '\x1b[34m', // 蓝色 'PixivBackend': '\x1b[35m', // 紫色 'PixivAuth': '\x1b[36m', // 青色 @@ -51,7 +52,6 @@ const ModuleColors = { 'Artist': '\x1b[92m', // 亮绿色 'Repository': '\x1b[94m', // 亮蓝色 'ErrorHandler': '\x1b[91m', // 亮红色 - 'API': '\x1b[97m', // 亮白色 'FileManager': '\x1b[98m', // 亮青色 'ProgressManager': '\x1b[99m', // 亮紫色 'Default': '\x1b[39m' // 默认颜色 @@ -63,14 +63,14 @@ const ModuleColors = { const RESET_COLOR = '\x1b[0m'; /** - * 日志图标映射 + * 日志级别文本映射 */ -const LogLevelIcons = { - [LogLevel.ERROR]: '❌', - [LogLevel.WARN]: '⚠️', - [LogLevel.INFO]: 'ℹ️', - [LogLevel.DEBUG]: '🔧', - [LogLevel.TRACE]: '🔍' +const LogLevelTexts = { + [LogLevel.ERROR]: 'ERROR', + [LogLevel.WARN]: 'WARN', + [LogLevel.INFO]: 'INFO', + [LogLevel.DEBUG]: 'DEBUG', + [LogLevel.TRACE]: 'TRACE' }; class Logger { @@ -143,10 +143,9 @@ class Logger { */ formatMessage(level, message, data = null) { const timeStr = this.getTimeString(); - const levelName = LogLevelNames[level]; - const icon = LogLevelIcons[level]; + const levelName = LogLevelTexts[level]; - let formattedMessage = `[${timeStr}] [${levelName}] [${this.module}] ${icon} ${message}`; + let formattedMessage = `[${timeStr}] [${levelName}] [${this.module}] ${message}`; if (data !== null && data !== undefined) { if (typeof data === 'object') { @@ -345,4 +344,4 @@ module.exports = { LogLevel, LogLevelNames, defaultLogger -}; \ No newline at end of file +}; \ No newline at end of file diff --git a/scripts/create-portable.js b/scripts/create-portable.js index af45da2..d02fae3 100644 --- a/scripts/create-portable.js +++ b/scripts/create-portable.js @@ -95,12 +95,12 @@ pause await fs.ensureDir(path.join(portableDir, 'data')); await fs.ensureDir(path.join(portableDir, 'downloads')); - logger.info('✅ 便携版创建完成!'); - logger.info(`📁 位置: ${portableDir}`); - logger.info('📦 可以将整个文件夹打包分发给用户'); + logger.info('便携版创建完成!'); + logger.info(`位置: ${portableDir}`); + logger.info('可以将整个文件夹打包分发给用户'); } catch (error) { - logger.error('❌ 创建便携版失败', error); + logger.error('创建便携版失败', error); } } diff --git a/start.bat b/start.bat index c1627fe..f6d9843 100644 --- a/start.bat +++ b/start.bat @@ -13,20 +13,20 @@ set PROXY_PORT= set SERVER_PORT=3000 echo. -echo 🚀 Pixiv Manager 启动中... +echo Pixiv Manager 启动中... echo. cd /d "%~dp0" -echo 📡 当前代理端口: %PROXY_PORT% -echo 🌐 当前服务器端口: %SERVER_PORT% -echo 💡 如需修改端口,请用记事本打开此文件,修改对应的端口号 +echo 当前代理端口: %PROXY_PORT% +echo 当前服务器端口: %SERVER_PORT% +echo 如需修改端口,请用记事本打开此文件,修改对应的端口号 echo. -echo 📊 启动后端服务器... -echo 🌐 访问地址: http://localhost:%SERVER_PORT% +echo 启动后端服务器... +echo 访问地址: http://localhost:%SERVER_PORT% echo. -echo 💡 提示: 按 Ctrl+C 停止服务器 +echo 提示: 按 Ctrl+C 停止服务器 echo. :: 启动服务器并传递代理端口和服务器端口 @@ -37,5 +37,5 @@ if "%PROXY_PORT%"=="" ( ) echo. -echo ⏹️ 服务器已停止 +echo 服务器已停止 pause \ No newline at end of file