--- kind: logging_system name: 基于 Winston 的日志系统 category: logging_system scope: - '**' source_files: - backend/src/config/logger.js - backend/src/app.js - backend/src/config/database.js - backend/package.json --- ## 1. 使用的系统与框架 - 后端采用 **Winston v3** 作为统一日志框架,通过 `backend/src/config/logger.js` 集中创建并导出单例 logger。 - 前端(Vue3)未发现专用日志库,未在前端代码中引入结构化日志输出。 - Sequelize 在开发环境将 SQL 查询直接 `console.log` 到控制台,生产环境关闭 SQL 日志。 ## 2. 核心文件与包 - `backend/src/config/logger.js` — Winston 实例定义、格式与传输配置 - `backend/src/app.js` — 应用启动时记录数据库同步、服务监听等关键事件 - `backend/package.json` — 依赖声明 `winston: ^3.14` - `backend/logs/app.log` — 默认文件日志输出路径 - `backend/src/config/database.js` — Sequelize 的 `logging` 开关逻辑 ## 3. 架构与约定 - **单例导出**:`logger.js` 使用 `winston.createLogger()` 创建全局 logger,并通过 `module.exports = logger` 供各模块 `require('../config/logger')` 复用。 - **日志级别**:全局默认 level 为 `info`;业务代码中使用 `logger.info / warn / error` 三个级别,未见 `debug` 调用。 - **输出格式**:时间戳 + 级别 + 消息 + 可选 JSON meta 字段,形如: ``` 2026-06-09 12:34:56 - info - User admin logged in {} ``` - **双通道输出**:同时写入 Console 和文件 `backend/logs/app.log`,编码 UTF-8。 - **无按级别/日期分片**:当前仅一个 `app.log` 文件,未启用 `FileTransport` 的 `maxsize`、`maxFiles`、`filename` 模板等滚动策略。 - **Sequelize SQL 日志**:仅在 `isDevelopment` 时开启,输出到 `console.log`,不经过 Winston。 - **中间件层**:未集成 Express 请求日志中间件(如 `morgan`),HTTP 访问日志未统一采集。 ## 4. 开发者应遵循的规则 - **统一入口**:所有日志必须通过 `const logger = require('../config/logger')` 获取,禁止直接使用 `console.log` 输出业务日志。 - **级别选择**: - `info`:正常业务流程事件(登录成功、密码修改、数据操作完成等) - `warn`:可恢复异常或潜在问题(登录失败、参数校验警告等) - `error`:不可恢复错误(数据库异常、外部服务调用失败等) - **结构化字段**:通过第三个参数传入对象以附加上下文,例如 `logger.warn({ username, ip }, 'Login failed')`,该对象会被序列化为 JSON 追加到消息末尾。 - **敏感信息**:避免在日志中记录明文密码、完整 token 等敏感内容。 - **SQL 调试**:如需查看底层 SQL,确保环境变量处于开发模式以使 Sequelize logging 生效;生产环境应保持关闭以避免性能损耗。 - **日志轮转**:当前未配置自动轮转,部署时应配合外部工具(如 `logrotate`、Docker log driver)管理 `backend/logs/app.log` 大小。