Files
2026-07-10 11:25:45 +08:00

47 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/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` 大小。