333 lines
7.7 KiB
Markdown
333 lines
7.7 KiB
Markdown
# 日志管理功能实施总结(2026-03-05)
|
||
|
||
## 实施概述
|
||
|
||
按照你的需求,实现了统一的日志管理功能:
|
||
- ✅ 统一日志目录结构
|
||
- ✅ 前端管理模块(放在运维自检)
|
||
- ✅ Modal 查看日志
|
||
- ✅ 手动删除(不自动删除)
|
||
- ✅ 仅管理员可删除
|
||
|
||
---
|
||
|
||
## 已完成的工作
|
||
|
||
### 1. 创建统一日志目录结构
|
||
|
||
```
|
||
logs/
|
||
├── app/ # 应用日志
|
||
├── tasks/ # 任务日志
|
||
│ ├── envi/ # ENVI 工作流日志
|
||
│ └── unpacker/ # 解包任务日志
|
||
└── error/ # 错误日志
|
||
```
|
||
|
||
### 2. 移动现有日志文件
|
||
|
||
- ✅ `unpacker_activity.log` → `logs/tasks/unpacker/unpacker_20260304.log`
|
||
- ✅ `unpacker_log.json` → `logs/tasks/unpacker/unpacker_20260304.json`
|
||
|
||
### 3. 修改 unpacker 脚本
|
||
|
||
**文件**:`scripts/unpack_archives.py`
|
||
|
||
**修改内容**:
|
||
- 使用统一的日志目录 `logs/tasks/unpacker/`
|
||
- 使用日期命名日志文件(`unpacker_YYYYMMDD.log`)
|
||
- 自动创建日志目录
|
||
|
||
### 4. 更新 .gitignore
|
||
|
||
**新增内容**:
|
||
```gitignore
|
||
# 日志文件
|
||
logs/
|
||
*.log
|
||
*.log.*
|
||
|
||
# 但保留日志目录结构
|
||
!logs/.gitkeep
|
||
!logs/app/.gitkeep
|
||
!logs/tasks/.gitkeep
|
||
!logs/error/.gitkeep
|
||
```
|
||
|
||
### 5. 实现后端 API
|
||
|
||
**文件**:`backend/app/routers/logs.py`
|
||
|
||
**API 端点**:
|
||
1. `GET /logs/list` - 列出所有日志文件
|
||
- 支持按类型过滤(app, task, error)
|
||
- 返回文件名、大小、修改时间
|
||
|
||
2. `GET /logs/content/{log_path}` - 读取日志内容
|
||
- 支持分页读取(offset, limit)
|
||
- 最多一次读取 10000 行
|
||
- 防止路径遍历攻击
|
||
|
||
3. `DELETE /logs/{log_path}` - 删除日志文件
|
||
- 仅管理员可删除
|
||
- 防止路径遍历攻击
|
||
|
||
**安全特性**:
|
||
- 路径安全检查(防止 `../` 攻击)
|
||
- 权限控制(删除仅管理员)
|
||
- 文件类型验证
|
||
|
||
### 6. 实现前端 API
|
||
|
||
**文件**:`frontend/src/api/logs.js`
|
||
|
||
**函数**:
|
||
- `listLogs(logType)` - 获取日志列表
|
||
- `getLogContent(logPath, offset, limit)` - 获取日志内容
|
||
- `deleteLog(logPath)` - 删除日志
|
||
|
||
### 7. 实现前端日志管理组件
|
||
|
||
**文件**:`frontend/src/LogManagementPanel.jsx`
|
||
|
||
**功能**:
|
||
- 日志列表展示(表格形式)
|
||
- 类型过滤(应用/任务/错误)
|
||
- 查看日志(Modal)
|
||
- 删除日志(仅管理员,需确认)
|
||
- 日志搜索(实时过滤)
|
||
- 分页加载(大文件支持)
|
||
|
||
**UI 特性**:
|
||
- 类型标签(彩色徽章)
|
||
- 文件大小格式化(B/KB/MB)
|
||
- 修改时间显示
|
||
- 深色代码编辑器风格
|
||
- 响应式布局
|
||
|
||
### 8. 集成到运维自检
|
||
|
||
**修改文件**:
|
||
- `frontend/src/HealthCheckPanel.jsx` - 添加日志管理区域
|
||
- `frontend/src/App.jsx` - 传递 currentUser 参数
|
||
|
||
---
|
||
|
||
## 功能特性
|
||
|
||
### 日志列表
|
||
|
||
| 列名 | 说明 |
|
||
|------|------|
|
||
| 文件名 | 日志文件名(等宽字体) |
|
||
| 类型 | 应用/任务/错误(彩色标签) |
|
||
| 大小 | 文件大小(自动格式化) |
|
||
| 修改时间 | 最后修改时间 |
|
||
| 操作 | 查看/删除按钮 |
|
||
|
||
**过滤功能**:
|
||
- 全部
|
||
- 应用日志
|
||
- 任务日志
|
||
- 错误日志
|
||
|
||
### 日志查看 Modal
|
||
|
||
**顶部信息栏**:
|
||
- 文件名(等宽字体)
|
||
- 文件大小
|
||
- 修改时间
|
||
- 总行数
|
||
|
||
**搜索栏**:
|
||
- 实时搜索(过滤日志内容)
|
||
- 显示当前行范围
|
||
- 上一页/下一页按钮
|
||
|
||
**日志内容区**:
|
||
- 深色背景(#1e1e1e)
|
||
- 等宽字体(Consolas, Monaco)
|
||
- 自动换行
|
||
- 滚动查看
|
||
|
||
### 删除功能
|
||
|
||
**权限控制**:
|
||
- 只有管理员可以看到删除按钮
|
||
- 非管理员点击会提示"只有管理员可以删除日志"
|
||
|
||
**确认对话框**:
|
||
```
|
||
确定要删除日志文件 "xxx.log" 吗?
|
||
|
||
此操作不可恢复!
|
||
```
|
||
|
||
---
|
||
|
||
## 技术实现
|
||
|
||
### 后端
|
||
|
||
**路径安全检查**:
|
||
```python
|
||
def _is_safe_path(file_path: str) -> bool:
|
||
"""检查路径是否安全(防止路径遍历攻击)"""
|
||
try:
|
||
requested_path = (LOG_ROOT / file_path).resolve()
|
||
return requested_path.is_relative_to(LOG_ROOT)
|
||
except (ValueError, RuntimeError):
|
||
return False
|
||
```
|
||
|
||
**分页读取**:
|
||
```python
|
||
with open(log_file, "r", encoding="utf-8", errors="replace") as f:
|
||
lines = f.readlines()
|
||
|
||
total_lines = len(lines)
|
||
start = offset
|
||
end = min(offset + limit, total_lines)
|
||
content_lines = lines[start:end]
|
||
```
|
||
|
||
### 前端
|
||
|
||
**分页加载**:
|
||
```javascript
|
||
const loadLogContent = async (logPath, offset = 0) => {
|
||
const data = await getLogContent(logPath, offset, 1000);
|
||
setLogContent(data.content);
|
||
setTotalLines(data.total_lines);
|
||
setCurrentOffset(offset);
|
||
};
|
||
```
|
||
|
||
**实时搜索**:
|
||
```javascript
|
||
const filteredContent = searchTerm
|
||
? logContent.split('\n')
|
||
.filter(line => line.toLowerCase().includes(searchTerm.toLowerCase()))
|
||
.join('\n')
|
||
: logContent;
|
||
```
|
||
|
||
---
|
||
|
||
## 使用说明
|
||
|
||
### 查看日志
|
||
|
||
1. 登录系统
|
||
2. 进入"运维自检" Tab
|
||
3. 滚动到"日志管理"区域
|
||
4. 点击日志文件的"查看"按钮
|
||
5. 在 Modal 中查看日志内容
|
||
6. 使用搜索框过滤内容
|
||
7. 使用上一页/下一页浏览大文件
|
||
|
||
### 删除日志
|
||
|
||
1. 以管理员身份登录
|
||
2. 进入"运维自检" Tab
|
||
3. 找到要删除的日志文件
|
||
4. 点击"删除"按钮
|
||
5. 确认删除操作
|
||
6. 日志文件被永久删除
|
||
|
||
### 过滤日志
|
||
|
||
1. 使用"类型过滤"下拉菜单
|
||
2. 选择"应用日志"、"任务日志"或"错误日志"
|
||
3. 列表自动更新
|
||
|
||
---
|
||
|
||
## 文件清单
|
||
|
||
### 后端文件
|
||
- `backend/app/routers/logs.py` - 日志管理 API(新建)
|
||
- `backend/app/routers/__init__.py` - 注册日志路由(修改)
|
||
- `scripts/unpack_archives.py` - 使用新日志路径(修改)
|
||
|
||
### 前端文件
|
||
- `frontend/src/api/logs.js` - 日志 API 封装(新建)
|
||
- `frontend/src/LogManagementPanel.jsx` - 日志管理组件(新建)
|
||
- `frontend/src/HealthCheckPanel.jsx` - 集成日志管理(修改)
|
||
- `frontend/src/App.jsx` - 传递 currentUser(修改)
|
||
|
||
### 配置文件
|
||
- `.gitignore` - 忽略日志文件(新建)
|
||
|
||
### 目录结构
|
||
- `logs/` - 统一日志目录(新建)
|
||
- `logs/app/` - 应用日志目录(新建)
|
||
- `logs/tasks/envi/` - ENVI 日志目录(新建)
|
||
- `logs/tasks/unpacker/` - 解包日志目录(新建)
|
||
- `logs/error/` - 错误日志目录(新建)
|
||
|
||
---
|
||
|
||
## 测试清单
|
||
|
||
### 后端测试
|
||
- [ ] 启动后端服务
|
||
- [ ] 访问 `/api/logs/list` 验证 API
|
||
- [ ] 访问 `/api/logs/content/{log_path}` 验证内容读取
|
||
- [ ] 测试路径遍历攻击(应该被拒绝)
|
||
- [ ] 测试删除权限(非管理员应该被拒绝)
|
||
|
||
### 前端测试
|
||
- [ ] 打包前端(`npm run build`)
|
||
- [ ] 登录系统
|
||
- [ ] 进入"运维自检" Tab
|
||
- [ ] 验证日志列表显示
|
||
- [ ] 点击"查看"按钮验证 Modal
|
||
- [ ] 测试搜索功能
|
||
- [ ] 测试分页功能
|
||
- [ ] 测试删除功能(管理员)
|
||
- [ ] 测试删除权限(非管理员应该看不到删除按钮)
|
||
|
||
### 集成测试
|
||
- [ ] 运行 unpacker 脚本,验证日志保存到新位置
|
||
- [ ] 在前端查看新生成的日志
|
||
- [ ] 删除日志后验证文件确实被删除
|
||
|
||
---
|
||
|
||
## 下一步优化(可选)
|
||
|
||
### 短期优化
|
||
1. 添加日志下载功能(如果需要)
|
||
2. 添加日志实时刷新(WebSocket)
|
||
3. 添加日志高亮(错误/警告)
|
||
|
||
### 长期优化
|
||
1. 使用 Monaco Editor 替代 Textarea
|
||
2. 添加日志统计(错误数、警告数)
|
||
3. 添加日志归档功能
|
||
4. 集成日志分析工具(ELK)
|
||
|
||
---
|
||
|
||
## 总结
|
||
|
||
✅ 已完成所有需求:
|
||
1. 统一日志管理 ✅
|
||
2. 前端管理模块(放在运维自检)✅
|
||
3. Modal 查看日志 ✅
|
||
4. 手动删除(不自动删除)✅
|
||
5. 仅管理员可删除 ✅
|
||
|
||
**代码修改**:
|
||
- 新建文件:5 个
|
||
- 修改文件:4 个
|
||
- 总代码行数:约 400 行
|
||
|
||
**风险评估**:🟢 低风险
|
||
- 不影响现有功能
|
||
- 只读操作无风险
|
||
- 删除操作有权限控制和确认
|
||
|
||
**状态**:✅ 代码完成,等待测试验证
|