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.

175 lines
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 客户端示例
```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 秒后自动消失