# 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/log/stats ``` ### 2. 清空日志缓存 ``` POST /api/log/clear ``` ### 3. 重置日志缓存 ``` POST /api/log/reset ``` ### 4. 添加测试日志数据 ``` POST /api/log/add-test-data ``` ### 5. 实时日志流(SSE) ``` GET /api/log/stream ``` ### 6. 调试信息 ``` GET /api/log/debug GET /api/log/connection-status GET /api/log/test-connection POST /api/log/force-push-test ``` ## 事件类型 ### StreamLogs 事件 - `connected`: 连接建立 - `history`: 历史日志(初始推送) - `new_logs`: 新日志 - `reset`: 日志缓存重置 - `error`: 处理错误 - `disconnected`: 连接断开 - `fatal_error`: 致命错误 ### StreamClientMessages 事件 - `open`: 连接建立 - `update`: 消息更新(sent/received) - `error`: 处理错误 - `disconnected`: 连接断开 - `fatal_error`: 致命错误 ## 使用示例 ### JavaScript 客户端示例 ```javascript // 连接日志流 const eventSource = new EventSource('/api/log/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 秒后自动消失