From 54b0f68b163e1e22c58dc880bb5eabd200061680 Mon Sep 17 00:00:00 2001 From: Shijia Huang Date: Wed, 25 Mar 2026 19:45:30 +1100 Subject: [PATCH] update log --- backend/package-lock.json | 47 +++++++++++++++++++++++++++++++++++++ backend/package.json | 1 + backend/src/utils/logger.ts | 21 +++++++++++------ 3 files changed, 62 insertions(+), 7 deletions(-) diff --git a/backend/package-lock.json b/backend/package-lock.json index 3639d92..cc9153b 100644 --- a/backend/package-lock.json +++ b/backend/package-lock.json @@ -14,6 +14,7 @@ "openai": "^4.77.0", "tencentcloud-sdk-nodejs-sts": "^4.1.100", "winston": "^3.19.0", + "winston-daily-rotate-file": "^5.0.0", "ws": "^8.19.0", "zod": "^3.24.0" }, @@ -2093,6 +2094,15 @@ "node": "^10.12.0 || >=12.0.0" } }, + "node_modules/file-stream-rotator": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/file-stream-rotator/-/file-stream-rotator-0.6.1.tgz", + "integrity": "sha512-u+dBid4PvZw17PmDeRcNOtCP9CCK/9lRN2w+r1xIS7yOL9JFrIBKTvrYsxT4P0pGtThYTn++QS5ChHaUov3+zQ==", + "license": "MIT", + "dependencies": { + "moment": "^2.29.1" + } + }, "node_modules/fill-range": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", @@ -2864,6 +2874,15 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/moment": { + "version": "2.30.1", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz", + "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==", + "license": "MIT", + "engines": { + "node": "*" + } + }, "node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", @@ -2923,6 +2942,15 @@ } } }, + "node_modules/object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, "node_modules/object-inspect": { "version": "1.13.4", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", @@ -3923,6 +3951,7 @@ "resolved": "https://registry.npmjs.org/winston/-/winston-3.19.0.tgz", "integrity": "sha512-LZNJgPzfKR+/J3cHkxcpHKpKKvGfDZVPS4hfJCc4cCG0CgYzvlD6yE/S3CIL/Yt91ak327YCpiF/0MyeZHEHKA==", "license": "MIT", + "peer": true, "dependencies": { "@colors/colors": "^1.6.0", "@dabh/diagnostics": "^2.0.8", @@ -3940,6 +3969,24 @@ "node": ">= 12.0.0" } }, + "node_modules/winston-daily-rotate-file": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/winston-daily-rotate-file/-/winston-daily-rotate-file-5.0.0.tgz", + "integrity": "sha512-JDjiXXkM5qvwY06733vf09I2wnMXpZEhxEVOSPenZMii+g7pcDcTBt2MRugnoi8BwVSuCT2jfRXBUy+n1Zz/Yw==", + "license": "MIT", + "dependencies": { + "file-stream-rotator": "^0.6.1", + "object-hash": "^3.0.0", + "triple-beam": "^1.4.1", + "winston-transport": "^4.7.0" + }, + "engines": { + "node": ">=8" + }, + "peerDependencies": { + "winston": "^3" + } + }, "node_modules/winston-transport": { "version": "4.9.0", "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.9.0.tgz", diff --git a/backend/package.json b/backend/package.json index a476b52..4fabc3b 100644 --- a/backend/package.json +++ b/backend/package.json @@ -23,6 +23,7 @@ "openai": "^4.77.0", "tencentcloud-sdk-nodejs-sts": "^4.1.100", "winston": "^3.19.0", + "winston-daily-rotate-file": "^5.0.0", "ws": "^8.19.0", "zod": "^3.24.0" }, diff --git a/backend/src/utils/logger.ts b/backend/src/utils/logger.ts index 4c99711..d870dba 100644 --- a/backend/src/utils/logger.ts +++ b/backend/src/utils/logger.ts @@ -8,17 +8,18 @@ * * Structured mode activates when there is exactly one argument and it is a * plain (non-Error) object. This produces top-level JSON fields for - * grep-ability (e.g. grep roomId in logs/combined.log). + * grep-ability (e.g. grep roomId in logs/combined-YYYY-MM-DD.log). * * Transports: * - Console: colorized readable format (dev) or JSON (prod) - * - logs/error.log: error level only, always JSON - * - logs/combined.log: all levels, always JSON + * - logs/error-YYYY-MM-DD.log: error level only, always JSON, rotated daily + * - logs/combined-YYYY-MM-DD.log: all levels, always JSON, rotated daily * * Log level is controlled by LOG_LEVEL env var (default: info). */ import winston from 'winston'; +import DailyRotateFile from 'winston-daily-rotate-file'; const { combine, timestamp, errors, json, printf } = winston.format; @@ -81,14 +82,20 @@ const winstonLogger = winston.createLogger({ new winston.transports.Console({ format: isDev ? devConsoleFormat : jsonFormat, }), - new winston.transports.File({ - filename: 'logs/error.log', + new DailyRotateFile({ + dirname: 'logs', + filename: 'error-%DATE%.log', + datePattern: 'YYYY-MM-DD', level: 'error', format: jsonFormat, + maxFiles: '30d', }), - new winston.transports.File({ - filename: 'logs/combined.log', + new DailyRotateFile({ + dirname: 'logs', + filename: 'combined-%DATE%.log', + datePattern: 'YYYY-MM-DD', format: jsonFormat, + maxFiles: '30d', }), ], });