Files
SillyTavern_replica/WEBSOCKET_LOGS_EXAMPLE.md

318 lines
8.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# WebSocket 链路详细日志示例
本文档展示了添加详细日志后WebSocket 链路的完整输出示例。
## 后端日志输出示例
### 1. 连接建立
```
================================================================================
[WebSocket] 📡 连接建立: 互动小说家/赛博朋克-数据幽灵
================================================================================
INFO: connection open
```
### 2. 接收请求
```
--------------------------------------------------------------------------------
[WebSocket] 📨 收到请求:
- Floor: 6
- Role: 互动小说家
- Chat: 赛博朋克-数据幽灵
- Stream: True
- Message Length: 45
--------------------------------------------------------------------------------
[WebSocket] 🌊 进入流式处理模式
[StreamChat] 🚀 开始流式处理
```
### 3. 工作流处理
```
################################################################################
[ChatWorkflow-Stream] 🚀 开始处理请求
- Role: 互动小说家
- Chat: 赛博朋克-数据幽灵
- Message Length: 45
################################################################################
[ChatWorkflow-Stream] ✅ 已加载角色卡: 互动小说家
[ChatWorkflow-Stream] 📚 世界书激活结果: 0 个条目
[ChatWorkflow-Stream] 💬 聊天历史加载结果: 0 条消息
[ChatWorkflow-Stream] 📝 提示词组装结果: 3 条消息
1. [system] 你是一个互动小说家,擅长创作赛博朋克风格的故...
2. [user] 请描述一个数据幽灵在夜之城中的冒险...
3. [assistant] ...
[ChatWorkflow-Stream] 🤖 开始流式调用 LLM
- Model: gpt-4
- Temperature: 1.0
- Max Tokens: 30000
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
```
### 4. LLM 客户端调用
```
[LLMClient] 🔧 创建 ChatOpenAI 实例
- Model: gpt-4
- API URL: https://api.openai.com/v1
- Temperature: 1.0
- Max Tokens: 30000
[LLMClient] 🚀 开始流式请求...
```
### 5. 流式输出进度
```
[ChatWorkflow-Stream] 📊 已接收 20 个 chunks, 当前长度: 156
[StreamChat] 📤 已发送 10 个 chunks
[ChatWorkflow-Stream] 📊 已接收 40 个 chunks, 当前长度: 312
[StreamChat] 📤 已发送 20 个 chunks
[ChatWorkflow-Stream] 📊 已接收 60 个 chunks, 当前长度: 478
[StreamChat] 📤 已发送 30 个 chunks
```
### 6. LLM 调用完成
```
[LLMClient] ✅ 流式请求完成
- 总 Chunks: 85
- 耗时: 3.45秒
- Prompt Tokens: 256
- Completion Tokens: 512
- Total Tokens: 768
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
[ChatWorkflow-Stream] ✅ LLM 流式调用完成
- 总 Chunks: 85
- 内容长度: 680
################################################################################
```
### 7. 发送响应
```
[StreamChat] ✨ 流式生成成功,总长度: 680
[StreamChat] 📚 发送世界书激活信息: 0 个条目
[StreamChat] ✅ 发送完成信号
[StreamChat] 💾 保存消息到文件...
[WebSocket] 消息已保存: 互动小说家/赛博朋克-数据幽灵
[StreamChat] ✅ 消息保存完成
```
### 8. 连接断开
```
================================================================================
[WebSocket] 🔌 连接断开: 互动小说家/赛博朋克-数据幽灵
================================================================================
```
## 前端日志输出示例
### 1. 建立连接
```javascript
================================================================================
[WebSocket] 📡 连接已建立
- URL: ws://localhost:23337/api/chat/%E4%BA%92%E5%8A%A8%E5%B0%8F%E8%AF%B4%E5%AE%B6/%E8%B5%9B%E5%8D%9A%E6%9C%8B%E5%85%8B-%E6%95%B0%E6%8D%AE%E5%B9%BD%E7%81%B5/ws
- Ready State: 1
================================================================================
```
### 2. 发送消息
```javascript
--------------------------------------------------------------------------------
[WebSocket] 📤 发送消息:
- Floor: 6
- Role: 互动小说家
- Chat: 赛博朋克-数据幽灵
- Stream: true
- Message Length: 45
--------------------------------------------------------------------------------
```
### 3. 接收流式数据
```javascript
[WebSocket] 📊 已接收 10 chunks
[WebSocket] 📊 已接收 20 chunks
[WebSocket] 📊 已接收 30 chunks
```
### 4. 接收其他消息类型
```javascript
[WebSocket] 📚 收到世界书激活信息: 0 个条目
[WebSocket] 📋 收到任务ID信息: {imageWorkflow: "img_xxx", dynamicTable: "tbl_xxx"}
```
### 5. 完成信号
```javascript
[WebSocket] 收到完成信号
- Chunks: 85
- 消息长度: 680
```
### 6. 连接关闭
```javascript
================================================================================
[WebSocket] 🔌 连接已关闭
- Code: 1000
- Reason:
- Was Clean: true
================================================================================
```
## 错误情况日志示例
### 1. LLM 调用失败
```
[LLMClient] ❌ 流式调用失败: API key is invalid
Traceback (most recent call last):
File "backend/utils/llm_client.py", line 278, in stream_chat
async for chunk in llm.astream(messages):
...
openai.AuthenticationError: Error code: 401 - {'error': {'message': 'Invalid API key'}}
```
### 2. 工作流处理失败
```
[ChatWorkflow-Stream] ⚠️ 错误: 角色 '不存在的角色' 不存在
Traceback (most recent call last):
File "backend/services/chat_workflow_service.py", line 765, in process_chat_request_stream
return {
...
```
### 3. WebSocket 错误
```
================================================================================
[WebSocket] ⚠️ 错误: Connection closed unexpectedly
================================================================================
```
## 日志级别说明
### 符号含义
- 📡 - 连接相关
- 📨 - 接收消息
- 📤 - 发送消息
- 🚀 - 开始处理
- ✅ - 成功完成
- ❌ - 错误/失败
- 📊 - 进度统计
- 📚 - 世界书相关
- 📋 - 任务相关
- 💬 - 聊天历史
- 📝 - 提示词
- 🤖 - LLM 调用
- 💾 - 文件保存
- 🔌 - 连接断开
- ⚠️ - 警告
### 分隔符
- `=` (80个) - 重要事件边界(连接建立/断开)
- `-` (80个) - 请求边界
- `#` (80个) - 工作流处理边界
- `~` (80个) - LLM 调用边界
## 日志配置建议
### 开发环境
在开发环境中,显示所有日志以便调试:
```python
# 保持当前的详细日志输出
```
### 生产环境
在生产环境中,可以简化日志:
```python
# 只记录关键事件
print(f"[WebSocket] 连接建立: {role_name}/{chat_name}")
print(f"[WebSocket] 收到请求: floor={request_data.get('floor')}")
print(f"[WebSocket] 生成完成,内容长度: {len(content)}")
```
## 日志分析工具
### 提取关键指标
```bash
# 统计平均响应时间
grep "耗时:" logs.txt | awk '{sum += $2; count++} END {print "平均耗时:", sum/count, "秒"}'
# 统计 Token 使用
grep "Total Tokens:" logs.txt | awk '{sum += $3; count++} END {print "平均 Token:", sum/count}'
# 统计错误率
grep "❌" logs.txt | wc -l
```
### 实时监控
```bash
# 实时查看 WebSocket 日志
tail -f logs.txt | grep --line-buffered "WebSocket\|StreamChat\|ChatWorkflow\|LLMClient"
```
## 性能优化建议
基于日志分析:
1. **如果 LLM 调用耗时过长** (>10秒)
- 检查网络连接
- 考虑使用更快的模型
- 减少 max_tokens
2. **如果 Chunk 数量过多** (>200)
- 检查是否启用了不必要的功能
- 优化提示词长度
3. **如果世界书激活数量过多** (>10)
- 检查触发条件是否过于宽松
- 优化关键词匹配
4. **如果聊天历史加载失败**
- 检查 CHATS_PATH 配置
- 确认文件权限
## 总结
通过详细的日志记录,可以:
1. ✅ 清晰地追踪 WebSocket 的完整链路
2. ✅ 快速定位问题所在
3. ✅ 分析性能瓶颈
4. ✅ 监控系统运行状态
5. ✅ 优化用户体验
建议在开发和测试阶段使用详细日志,在生产环境中根据需要调整日志级别。