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