Files
2026-07-20 18:39:33 +08:00

45 lines
3.0 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
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 中补充轮转策略。