LogRocket 会话回放 #
什么是会话回放? #
会话回放是 LogRocket 的核心功能,它记录用户在应用中的所有操作,让你可以像看电影一样回放用户的操作过程。
text
┌─────────────────────────────────────────────────────────────┐
│ 会话回放原理 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 传统录屏 vs LogRocket 会话回放: │
│ │
│ 传统录屏: │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ 录制整个屏幕为视频 │ │
│ │ ❌ 文件体积大(MB 级别) │ │
│ │ ❌ 无法搜索内容 │ │
│ │ ❌ 无法查看网络请求 │ │
│ │ ❌ 隐私问题严重 │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
│ LogRocket 会话回放: │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ 记录 DOM 变化和用户交互 │ │
│ │ ✅ 文件体积小(KB 级别) │ │
│ │ ✅ 可搜索、可过滤 │ │
│ │ ✅ 关联网络请求和日志 │ │
│ │ ✅ 支持隐私屏蔽 │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────┘
会话回放的工作原理 #
DOM 录制技术 #
text
┌─────────────────────────────────────────────────────────────┐
│ DOM 录制原理 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 1. 初始快照 │
│ - 页面加载时记录完整 DOM 结构 │
│ - 记录所有 CSS 样式 │
│ - 记录资源引用(图片、字体等) │
│ │
│ 2. 变化追踪 │
│ - 使用 MutationObserver 监听 DOM 变化 │
│ - 记录属性变化 │
│ - 记录节点增删 │
│ - 记录文本内容变化 │
│ │
│ 3. 用户交互 │
│ - 鼠标移动和点击 │
│ - 键盘输入 │
│ - 滚动事件 │
│ - 表单操作 │
│ │
│ 4. 重放 │
│ - 重建初始 DOM │
│ - 按时间顺序应用变化 │
│ - 模拟用户交互 │
│ │
└─────────────────────────────────────────────────────────────┘
数据结构 #
javascript
{
"type": "FullSnapshot",
"timestamp": 1705702800000,
"data": {
"node": {
"type": 1,
"tagName": "div",
"attributes": { "id": "app" },
"childNodes": [...]
}
}
}
{
"type": "IncrementalSnapshot",
"timestamp": 1705702801000,
"data": {
"source": 0,
"adds": [
{
"parentId": 1,
"node": {
"type": 1,
"tagName": "button",
"attributes": { "class": "btn" }
}
}
]
}
}
会话回放界面 #
主界面组成 #
text
┌─────────────────────────────────────────────────────────────┐
│ LogRocket 回放界面 │
├─────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ 工具栏 │ │
│ │ [播放/暂停] [进度条] [速度] [全屏] [分享] │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ 回放区域 │ │
│ │ │ │
│ │ ┌─────────────────────────────────┐ │ │
│ │ │ │ │ │
│ │ │ 用户操作画面重现 │ │ │
│ │ │ │ │ │
│ │ └─────────────────────────────────┘ │ │
│ │ │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
│ ┌───────────────┬─────────────────────────────────────┐ │
│ │ 事件时间线 │ 事件详情 │ │
│ ├───────────────┼─────────────────────────────────────┤ │
│ │ 10:30:01 │ 点击事件 │ │
│ │ 10:30:02 │ 网络请求: GET /api/users │ │
│ │ 10:30:03 │ 控制台: User data loaded │ │
│ │ 10:30:05 │ ❌ 错误: TypeError │ │
│ └───────────────┴─────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────┘
时间线事件类型 #
text
┌─────────────────────────────────────────────────────────────┐
│ 时间线事件类型 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 🖱️ 用户交互 │
│ - 点击 │
│ - 输入 │
│ - 滚动 │
│ - 拖拽 │
│ │
│ 🌐 网络请求 │
│ - XHR/Fetch 请求 │
│ - 请求状态码 │
│ - 响应时间 │
│ │
│ 📝 控制台日志 │
│ - log/info/warn/error │
│ - 日志内容 │
│ │
│ ❌ 错误事件 │
│ - JavaScript 错误 │
│ - 未捕获的 Promise 拒绝 │
│ - 资源加载失败 │
│ │
│ 🔀 路由变化 │
│ - URL 变化 │
│ - 页面导航 │
│ │
│ 📊 状态变化 │
│ - Redux action │
│ - Vuex mutation │
│ - 状态快照 │
│ │
└─────────────────────────────────────────────────────────────┘
会话搜索与过滤 #
按用户搜索 #
text
┌─────────────────────────────────────────────────────────────┐
│ 用户搜索 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 搜索条件: │
│ - 用户 ID │
│ - 用户邮箱 │
│ - 用户名 │
│ │
│ 使用场景: │
│ - 客服查找特定用户的会话 │
│ - 分析 VIP 用户的行为 │
│ - 追踪问题用户的操作 │
│ │
└─────────────────────────────────────────────────────────────┘
按事件搜索 #
text
┌─────────────────────────────────────────────────────────────┐
│ 事件搜索 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 搜索条件: │
│ - 错误类型 │
│ - 事件名称 │
│ - URL 路径 │
│ - 网络请求 │
│ │
│ 示例: │
│ - 错误包含 "TypeError" │
│ - URL 包含 "/checkout" │
│ - 请求状态码 = 500 │
│ │
└─────────────────────────────────────────────────────────────┘
按时间范围搜索 #
text
┌─────────────────────────────────────────────────────────────┐
│ 时间范围搜索 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 时间范围: │
│ - 最近 1 小时 │
│ - 最近 24 小时 │
│ - 最近 7 天 │
│ - 自定义范围 │
│ │
│ 使用场景: │
│ - 查看最新发布后的问题 │
│ - 分析特定时间段的问题 │
│ - 对比不同时段的用户行为 │
│ │
└─────────────────────────────────────────────────────────────┘
高级过滤 #
javascript
// 使用 LogRocket API 进行高级搜索
// 在控制台中使用搜索语法
// 搜索特定错误
error.message:"Cannot read property"
// 搜索特定 URL
url:"/checkout"
// 搜索特定用户
user.email:"john@example.com"
// 组合搜索
error.message:"TypeError" AND url:"/dashboard"
// 排除搜索
NOT user.email:"test@example.com"
会话分析技巧 #
1. 错误关联分析 #
text
┌─────────────────────────────────────────────────────────────┐
│ 错误关联分析 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 步骤: │
│ │
│ 1. 在错误列表中找到目标错误 │
│ 2. 点击错误查看详情 │
│ 3. 点击"查看会话"跳转到错误发生时刻 │
│ 4. 回放错误发生前的用户操作 │
│ 5. 分析网络请求和状态变化 │
│ │
│ 分析要点: │
│ - 错误发生前的用户操作 │
│ - 错误发生时的网络请求状态 │
│ - 错误发生时的应用状态 │
│ - 是否有控制台警告 │
│ │
└─────────────────────────────────────────────────────────────┘
2. 用户行为分析 #
text
┌─────────────────────────────────────────────────────────────┐
│ 用户行为分析 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 分析维度: │
│ │
│ 1. 页面停留时间 │
│ - 用户在页面停留多久 │
│ - 是否快速离开 │
│ │
│ 2. 交互频率 │
│ - 点击次数 │
│ - 表单填写情况 │
│ - 滚动深度 │
│ │
│ 3. 操作路径 │
│ - 用户访问了哪些页面 │
│ - 操作顺序是什么 │
│ - 是否有反复操作 │
│ │
│ 4. 困惑行为 │
│ - 多次点击同一元素 │
│ - 快速来回滚动 │
│ - 表单反复修改 │
│ │
└─────────────────────────────────────────────────────────────┘
3. 性能问题分析 #
text
┌─────────────────────────────────────────────────────────────┐
│ 性能问题分析 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 分析要点: │
│ │
│ 1. 页面加载 │
│ - 白屏时间 │
│ - 首次渲染时间 │
│ - 资源加载时间 │
│ │
│ 2. 网络请求 │
│ - 慢请求识别 │
│ - 请求失败 │
│ - 请求瀑布图 │
│ │
│ 3. 交互响应 │
│ - 点击后响应时间 │
│ - 输入延迟 │
│ - 动画流畅度 │
│ │
└─────────────────────────────────────────────────────────────┘
隐私保护 #
敏感数据屏蔽 #
javascript
LogRocket.init('your-app-id/app-name', {
dom: {
inputSanitizer: (el, value) => {
if (el.type === 'password') {
return '';
}
if (el.name === 'creditCard' || el.id === 'card-number') {
return '****';
}
if (el.name === 'ssn') {
return '***-**-****';
}
return value;
},
textSanitizer: true
}
});
网络请求过滤 #
javascript
LogRocket.init('your-app-id/app-name', {
network: {
requestSanitizer: (request) => {
if (request.url.includes('/api/auth/login')) {
if (request.body) {
const body = JSON.parse(request.body);
body.password = '[REDACTED]';
request.body = JSON.stringify(body);
}
return request;
}
if (request.url.includes('/api/payment')) {
return null;
}
return request;
},
responseSanitizer: (response) => {
if (response.url.includes('/api/user/sensitive')) {
return null;
}
return response;
}
}
});
完全屏蔽特定元素 #
html
<div data-private>
这里的内容不会被记录
</div>
<input data-private type="text" />
text
┌─────────────────────────────────────────────────────────────┐
│ 隐私屏蔽规则 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 自动屏蔽: │
│ - type="password" 的输入框 │
│ - 带有 data-private 属性的元素 │
│ │
│ 手动配置: │
│ - inputSanitizer: 过滤输入内容 │
│ - textSanitizer: 过滤文本内容 │
│ - requestSanitizer: 过滤请求 │
│ - responseSanitizer: 过滤响应 │
│ │
│ 建议屏蔽的敏感信息: │
│ - 密码 │
│ - 信用卡号 │
│ - 身份证号 │
│ - 社会安全号 │
│ - API 密钥 │
│ - Token │
│ │
└─────────────────────────────────────────────────────────────┘
会话分享 #
分享会话链接 #
text
┌─────────────────────────────────────────────────────────────┐
│ 会话分享 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 分享方式: │
│ │
│ 1. 分享整个会话 │
│ - 点击"分享"按钮 │
│ - 复制会话链接 │
│ - 发送给团队成员 │
│ │
│ 2. 分享特定时间点 │
│ - 在时间线上定位 │
│ - 分享带时间戳的链接 │
│ - 接收者直接跳转到该时刻 │
│ │
│ 3. 嵌入到工单系统 │
│ - 集成 Jira、Zendesk 等 │
│ - 自动附加会话链接 │
│ - 方便开发人员查看 │
│ │
└─────────────────────────────────────────────────────────────┘
与团队协作 #
javascript
// 在代码中获取会话 URL
const sessionUrl = LogRocket.sessionURL;
// 发送到错误追踪系统
fetch('/api/errors', {
method: 'POST',
body: JSON.stringify({
error: error.message,
stack: error.stack,
logrocketUrl: sessionUrl
})
});
会话回放最佳实践 #
1. 问题复现流程 #
text
┌─────────────────────────────────────────────────────────────┐
│ 问题复现流程 │
├─────────────────────────────────────────────────────────────┤
│ │
│ Step 1: 收到错误告警 │
│ ↓ │
│ Step 2: 在 LogRocket 中找到对应会话 │
│ ↓ │
│ Step 3: 跳转到错误发生时刻 │
│ ↓ │
│ Step 4: 回放错误发生前的操作 │
│ ↓ │
│ Step 5: 分析网络请求和状态 │
│ ↓ │
│ Step 6: 定位问题根因 │
│ ↓ │
│ Step 7: 修复并验证 │
│ │
└─────────────────────────────────────────────────────────────┘
2. UX 优化流程 #
text
┌─────────────────────────────────────────────────────────────┐
│ UX 优化流程 │
├─────────────────────────────────────────────────────────────┤
│ │
│ Step 1: 识别问题页面 │
│ - 高跳出率页面 │
│ - 低转化率页面 │
│ - 用户反馈问题 │
│ ↓ │
│ Step 2: 查看相关会话 │
│ - 随机抽样用户会话 │
│ - 关注用户行为模式 │
│ ↓ │
│ Step 3: 分析用户行为 │
│ - 停留时间 │
│ - 交互路径 │
│ - 困惑行为 │
│ ↓ │
│ Step 4: 提出改进方案 │
│ - 优化交互流程 │
│ - 改进页面布局 │
│ - 增强引导提示 │
│ ↓ │
│ Step 5: 验证改进效果 │
│ - A/B 测试 │
│ - 对比改进前后数据 │
│ │
└─────────────────────────────────────────────────────────────┘
3. 客户支持流程 #
text
┌─────────────────────────────────────────────────────────────┐
│ 客户支持流程 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 传统流程: │
│ 用户报告问题 → 客服询问详情 → 用户描述 → 技术调查 │
│ 耗时:数小时到数天 │
│ │
│ LogRocket 流程: │
│ 用户报告问题 → 客服查找会话 → 观看回放 → 快速定位 │
│ 耗时:数分钟 │
│ │
│ 最佳实践: │
│ 1. 让用户提供用户 ID 或邮箱 │
│ 2. 在 LogRocket 中搜索该用户的最近会话 │
│ 3. 快速定位问题发生时刻 │
│ 4. 如需技术介入,分享会话链接 │
│ │
└─────────────────────────────────────────────────────────────┘
会话数据保留 #
数据保留策略 #
text
┌─────────────────────────────────────────────────────────────┐
│ 数据保留策略 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 不同套餐的保留时间: │
│ │
│ Free: 7 天 │
│ Starter: 30 天 │
│ Professional: 90 天 │
│ Enterprise: 自定义 │
│ │
│ 建议: │
│ - 定期导出重要会话 │
│ - 对关键问题创建永久链接 │
│ - 集成到工单系统保存关联 │
│ │
└─────────────────────────────────────────────────────────────┘
下一步 #
现在你已经掌握了会话回放的使用方法,接下来学习 性能监控 了解如何监控和分析应用性能!
最后更新:2026-03-29