4 changed files with 794 additions and 81 deletions
@ -0,0 +1,175 @@ |
|||||
|
# 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 客户端示例 |
||||
|
|
||||
|
```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 秒后自动消失 |
||||
Loading…
Reference in new issue