You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

4.7 KiB

StreamLogs 方法优化说明

问题描述

原始的 StreamLogs 方法存在以下问题:

  1. 线程安全问题GetLogCache() 返回的集合在循环中多次调用可能导致不一致
  2. 性能问题:每次都调用 ToList()Skip() 操作,效率低下
  3. 内存泄漏风险:没有适当的错误处理和资源清理
  4. 索引更新逻辑错误logIndex = logCache.Count() 可能导致跳过日志
  5. 缺少错误处理:没有处理异常情况

优化内容

1. 线程安全优化

  • 使用 lastLogCount 变量跟踪上次处理的日志数量
  • 在每次循环中获取当前日志的快照,避免并发修改问题
  • 添加空值检查和异常处理

2. 性能优化

  • 减少不必要的 ToList() 调用
  • 优化索引更新逻辑,避免重复处理
  • 添加日志缓存重置检测

3. 错误处理增强

  • 添加完整的异常处理机制
  • 区分 OperationCanceledException 和其他异常
  • 添加错误恢复机制,避免频繁错误循环
  • 添加连接状态事件(connected, disconnected, error, fatal_error)

4. 新增功能

  • 添加 CORS 支持
  • 添加时间戳信息
  • 添加更详细的统计信息(totalCount, newCount)
  • 添加日志缓存管理API

前端页面优化 (Logs.cshtml)

1. 新增功能

  • 连接状态指示器:实时显示连接状态(连接中、已连接、已断开、错误)
  • 错误和信息提示:显示连接错误和操作信息
  • 控制按钮:清空日志、重置日志、重新连接
  • 新日志计数:显示新接收的日志数量
  • 自动重连机制:连接断开时自动重试(最多5次)

2. 用户体验改进

  • 视觉反馈:状态指示器使用不同颜色和动画效果
  • 操作确认:重要操作前显示确认对话框
  • 实时更新:新日志数量实时显示并自动消失
  • 错误恢复:连接失败时提供重连选项

3. 事件处理

  • 处理所有新的SSE事件类型
  • 支持日志缓存重置
  • 错误状态显示和恢复

新增API端点

1. 获取日志缓存统计信息

GET /api/websocket/logs/stats

2. 清空日志缓存

POST /api/websocket/logs/clear

3. 重置日志缓存

POST /api/websocket/logs/reset

事件类型

StreamLogs 事件

  • connected: 连接建立
  • history: 历史日志(初始推送)
  • new_logs: 新日志
  • reset: 日志缓存重置
  • error: 处理错误
  • disconnected: 连接断开
  • fatal_error: 致命错误

StreamClientMessages 事件

  • open: 连接建立
  • update: 消息更新(sent/received)
  • error: 处理错误
  • disconnected: 连接断开
  • fatal_error: 致命错误

使用示例

JavaScript 客户端示例

// 连接日志流
const eventSource = new EventSource('/api/websocket/logs/stream');

eventSource.addEventListener('connected', (event) => {
    console.log('日志流连接已建立');
});

eventSource.addEventListener('history', (event) => {
    const data = JSON.parse(event.data);
    console.log('历史日志:', data.logs);
});

eventSource.addEventListener('new_logs', (event) => {
    const data = JSON.parse(event.data);
    console.log('新日志:', data.logs);
});

eventSource.addEventListener('reset', (event) => {
    console.log('日志缓存已重置');
    // 清空前端显示
});

eventSource.addEventListener('error', (event) => {
    const data = JSON.parse(event.data);
    console.error('错误:', data.message);
});

eventSource.addEventListener('disconnected', (event) => {
    console.log('连接已断开');
});

// 错误处理
eventSource.onerror = (error) => {
    console.error('EventSource 错误:', error);
};

前端页面功能

连接状态指示器

  • 🟢 绿色脉冲:已连接
  • 🟡 黄色脉冲:连接中
  • 🔴 红色:已断开
  • 🔴 红色闪烁:错误状态

控制按钮

  • 清空:清空所有日志显示
  • 重置:重置服务器日志缓存
  • 重连:手动重新连接

状态显示

  • 总日志条数
  • 新日志数量(绿色显示,2秒后消失)
  • 连接状态文本

性能改进

  1. 内存使用:减少了不必要的对象创建
  2. CPU使用:优化了循环逻辑,减少了重复计算
  3. 网络效率:添加了更详细的事件信息,便于客户端处理
  4. 稳定性:增强了错误处理和恢复机制
  5. 用户体验:添加了实时状态反馈和错误提示

注意事项

  1. 日志缓存大小限制为 10000 条
  2. 检查间隔为 250 毫秒
  3. 错误恢复等待时间为 1000 毫秒
  4. 自动重连最多尝试 5 次,间隔 3 秒
  5. 所有时间戳使用 UTC 时间
  6. 前端错误提示显示 5 秒后自动消失
  7. 信息提示显示 3 秒后自动消失