--- kind: logging_system name: 后端日志系统(Winston 单文件输出) category: logging_system scope: - '**' source_files: - backend/src/config/logger.js - backend/src/app.js - backend/src/routes/auth.js - backend/src/config/redis.js - backend/package.json --- ## 1. 使用的框架与工具 - 日志框架:`winston ^3.14` - 依赖声明位于 `backend/package.json`,通过 `require('winston')` 引入。 - 前端未集成专用日志库,调试主要依赖浏览器控制台。 ## 2. 核心文件与位置 - 日志配置与实例导出:`backend/src/config/logger.js` - 应用入口统一引入:`backend/src/app.js`(`const logger = require('./config/logger');`) - 各模块按需引入使用,典型示例:`backend/src/routes/auth.js`、`backend/src/config/redis.js` 等。 - 默认日志文件路径:`backend/logs/app.log`(由 `logger.js` 自动创建目录并写入)。 ## 3. 架构与约定 - **集中式初始化**:所有日志输出均通过 `src/config/logger.js` 暴露的单一 `logger` 实例,避免重复配置。 - **输出目标(transports)**:同时输出到控制台和文件两个 sink: - Console transport:便于本地开发实时观察。 - File transport:固定文件名 `logs/app.log`,编码 UTF-8。 - **格式策略**:`timestamp + level + message + JSON meta` 拼接的单行文本格式,时间格式为 `YYYY-MM-DD HH:mm:ss`;当存在额外元数据时以空格分隔追加 JSON 字符串。 - **级别策略**:全局 `level: 'info'`,代码中仅使用 `info / warn / error` 三个级别,未见 `debug` 级别调用。 - **结构化字段**:未采用 winston 的 structured log 对象传参方式,而是将业务上下文拼入 message 字符串(如 `Login failed for username=${trimmedUsername}`),meta 字段基本未使用。 - **数据库层日志**:Sequelize 在开发环境启用原生 `console.log` 打印 SQL,生产环境关闭(`logging: isDevelopment ? (msg) => console.log(msg) : false`),不走 Winston。 ## 4. 开发者应遵循的规则 - **统一引用**:始终从 `../config/logger` 或相对路径引用同一 logger 实例,不要自行 `createLogger`。 - **级别选择**: - `info`:记录关键业务流程事件(登录成功、密码修改、服务启动等)。 - `warn`:记录可恢复异常或预期外的分支(用户名不存在、资源未找到等)。 - `error`:记录异常堆栈信息或不可恢复错误。 - 不使用 `debug` 级别。 - **消息内容**:将关键上下文(用户名、ID、MAC 等)直接拼入 message 字符串;如需附带复杂对象,可通过第三个参数传入 meta,但当前代码风格倾向于纯文本。 - **敏感信息**:禁止在日志中输出密码、token、完整请求体等敏感数据(现有代码已避免输出 password_hash/token 值)。 - **文件轮转**:当前未配置 winston-daily-rotate-file 等轮转插件,长期运行需注意 `app.log` 体积增长,后续可在 transports 中补充轮转策略。