Files
insar-management-system-v2/docs/archive/LOG_MANAGEMENT_IMPLEMENTATION_2026-03-05.md
T

333 lines
7.7 KiB
Markdown
Raw 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.
# 日志管理功能实施总结(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 行
**风险评估**:🟢 低风险
- 不影响现有功能
- 只读操作无风险
- 删除操作有权限控制和确认
**状态**:✅ 代码完成,等待测试验证