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

7.7 KiB
Raw Blame History

日志管理功能实施总结(2026-03-05)

实施概述

按照你的需求,实现了统一的日志管理功能:

  • 统一日志目录结构
  • 前端管理模块(放在运维自检)
  • Modal 查看日志
  • 手动删除(不自动删除)
  • 仅管理员可删除

已完成的工作

1. 创建统一日志目录结构

logs/
├── app/          # 应用日志
├── tasks/        # 任务日志
│   ├── envi/     # ENVI 工作流日志
│   └── unpacker/ # 解包任务日志
└── error/        # 错误日志

2. 移动现有日志文件

  • unpacker_activity.loglogs/tasks/unpacker/unpacker_20260304.log
  • unpacker_log.jsonlogs/tasks/unpacker/unpacker_20260304.json

3. 修改 unpacker 脚本

文件scripts/unpack_archives.py

修改内容

  • 使用统一的日志目录 logs/tasks/unpacker/
  • 使用日期命名日志文件(unpacker_YYYYMMDD.log
  • 自动创建日志目录

4. 更新 .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" 吗?

此操作不可恢复!

技术实现

后端

路径安全检查

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

分页读取

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]

前端

分页加载

const loadLogContent = async (logPath, offset = 0) => {
  const data = await getLogContent(logPath, offset, 1000);
  setLogContent(data.content);
  setTotalLines(data.total_lines);
  setCurrentOffset(offset);
};

实时搜索

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 行

风险评估🟢 低风险

  • 不影响现有功能
  • 只读操作无风险
  • 删除操作有权限控制和确认

状态 代码完成,等待测试验证