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
4.7 KiB
StreamLogs 方法优化说明
问题描述
原始的 StreamLogs
方法存在以下问题:
- 线程安全问题:
GetLogCache()
返回的集合在循环中多次调用可能导致不一致 - 性能问题:每次都调用
ToList()
和Skip()
操作,效率低下 - 内存泄漏风险:没有适当的错误处理和资源清理
- 索引更新逻辑错误:
logIndex = logCache.Count()
可能导致跳过日志 - 缺少错误处理:没有处理异常情况
优化内容
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秒后消失)
- 连接状态文本
性能改进
- 内存使用:减少了不必要的对象创建
- CPU使用:优化了循环逻辑,减少了重复计算
- 网络效率:添加了更详细的事件信息,便于客户端处理
- 稳定性:增强了错误处理和恢复机制
- 用户体验:添加了实时状态反馈和错误提示
注意事项
- 日志缓存大小限制为 10000 条
- 检查间隔为 250 毫秒
- 错误恢复等待时间为 1000 毫秒
- 自动重连最多尝试 5 次,间隔 3 秒
- 所有时间戳使用 UTC 时间
- 前端错误提示显示 5 秒后自动消失
- 信息提示显示 3 秒后自动消失