13 KiB
13 KiB
问题修复 - 重试失败日志增强 v3.12.6
版本: v3.12.6
日期: 2025-10-08
类型: 问题修复 / 日志增强
问题描述
用户反馈:
"失败重试的时候,没有把上次运行失败的项添加进去"
可能的问题:
- 重试时没有正确筛选失败的Token
- 重试时执行了所有Token而不是只执行失败的
- 日志信息不够详细,无法确认哪些Token被重试
问题分析
当前的重试逻辑
const retryFailedTasks = async () => {
// 获取所有失败的token ID
const failedTokenIds = Object.keys(taskProgress.value).filter(
tokenId => taskProgress.value[tokenId].status === 'failed'
)
if (failedTokenIds.length === 0) {
console.warn('⚠️ 没有失败的任务需要重试')
return
}
console.log(`🔄 开始重试 ${failedTokenIds.length} 个失败的任务`)
// 使用当前模板的任务列表
const tasks = currentTemplateTasks.value
// 执行失败的token(标记为重试)
await startBatchExecution(failedTokenIds, tasks, true)
}
逻辑分析:
- ✅ 正确筛选了
status === 'failed'的Token - ✅ 正确传递给
startBatchExecution - ❌ 日志信息不够详细,看不到具体哪些Token被重试
可能的问题场景
场景1:页面刷新后重试
1. 执行批量任务,3个Token失败
2. 用户刷新页面
3. taskProgress 数据丢失(不是持久化存储)
4. 点击"重试失败"按钮
5. failedTokenIds 为空数组 []
6. 提示"没有失败的任务需要重试"
场景2:关闭进度显示后重试
1. 执行批量任务,3个Token失败
2. 用户点击"关闭"按钮
3. 进度面板隐藏
4. taskProgress 仍然保留
5. 点击"重试失败"按钮
6. 应该能正常重试
场景3:日志信息不够清晰
1. 执行批量任务,3个Token失败
2. 点击"重试失败"按钮
3. 控制台只显示:"🔄 开始重试 3 个失败的任务"
4. 看不到具体是哪3个Token
5. 用户无法确认是否正确
解决方案
增强日志输出
添加详细的重试信息日志,让用户能清楚看到哪些Token被重试:
修改前
const retryFailedTasks = async () => {
const failedTokenIds = Object.keys(taskProgress.value).filter(
tokenId => taskProgress.value[tokenId].status === 'failed'
)
if (failedTokenIds.length === 0) {
console.warn('⚠️ 没有失败的任务需要重试')
return
}
console.log(`🔄 开始重试 ${failedTokenIds.length} 个失败的任务`)
const tasks = currentTemplateTasks.value
await startBatchExecution(failedTokenIds, tasks, true)
}
修改后
const retryFailedTasks = async () => {
// 获取所有失败的token ID
const failedTokenIds = Object.keys(taskProgress.value).filter(
tokenId => taskProgress.value[tokenId].status === 'failed'
)
if (failedTokenIds.length === 0) {
console.warn('⚠️ 没有失败的任务需要重试')
return
}
// 🆕 详细的重试信息日志
console.log(`━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━`)
console.log(`🔄 开始重试失败任务`)
console.log(`📊 失败Token数量: ${failedTokenIds.length}`)
console.log(`📋 失败Token列表:`, failedTokenIds)
console.log(`━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━`)
const tasks = currentTemplateTasks.value
await startBatchExecution(failedTokenIds, tasks, true)
}
增强startBatchExecution的日志
在重试模式下,显示具体要执行的Token列表:
修改前
console.log(`🚀 开始批量执行任务${isRetry ? ' (重试)' : ''}`)
console.log(`📋 Token数量: ${targetTokens.length}`)
console.log(`📋 任务列表:`, targetTasks)
修改后
console.log(`🚀 开始批量执行任务${isRetry ? ' (重试)' : ''}`)
console.log(`📋 Token数量: ${targetTokens.length}`)
// 🆕 重试模式下显示Token列表
if (isRetry) {
console.log(`📋 重试Token列表:`, targetTokens)
}
console.log(`📋 任务列表:`, targetTasks)
修改文件
src/stores/batchTaskStore.js
修改位置1: Line 2053-2057 (retryFailedTasks)
- 添加分隔线和详细的日志输出
- 显示失败Token的数量和具体列表
修改位置2: Line 320-322 (startBatchExecution)
- 在重试模式下显示Token列表
控制台输出效果
修改前
🔄 开始重试 3 个失败的任务
🚀 开始批量执行任务 (重试)
📋 Token数量: 3
📋 任务列表: ['dailyFix', 'legionSignIn', ...]
修改后
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
🔄 开始重试失败任务
📊 失败Token数量: 3
📋 失败Token列表: ['10601服-0-7145...', '10602服-1-7146...', '10603服-2-7147...']
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
🚀 开始批量执行任务 (重试)
📋 Token数量: 3
📋 重试Token列表: ['10601服-0-7145...', '10602服-1-7146...', '10603服-2-7147...']
📋 任务列表: ['dailyFix', 'legionSignIn', 'autoStudy', ...]
诊断指南
如何确认重试功能是否正常工作?
步骤1:执行批量任务
- 开始执行批量任务
- 等待执行完成
- 观察统计信息:
成功: 97 失败: 3
步骤2:点击"重试失败"按钮
- 点击"重试失败 (3个)"按钮
- 打开浏览器控制台(F12)
- 观察日志输出
步骤3:验证日志信息
预期日志:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
🔄 开始重试失败任务
📊 失败Token数量: 3
📋 失败Token列表: ['Token1', 'Token2', 'Token3']
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
🚀 开始批量执行任务 (重试)
📋 Token数量: 3
📋 重试Token列表: ['Token1', 'Token2', 'Token3']
验证要点:
- ✅ 失败Token数量 = 重试Token数量 = 3
- ✅ 失败Token列表与重试Token列表一致
- ✅ 只执行失败的3个Token,不执行成功的97个
常见问题诊断
问题1:显示"没有失败的任务需要重试"
控制台输出:
⚠️ 没有失败的任务需要重试
可能原因:
- 页面已刷新:taskProgress 数据丢失
- 已全部重试成功:所有失败任务都已重试成功
- 进度数据被清空:某个操作清空了 taskProgress
解决方法:
- 重新执行批量任务
- 不要刷新页面
- 失败后立即重试
问题2:重试的Token数量不对
预期:3个失败
实际:重试了100个
控制台输出:
📊 失败Token数量: 3
📋 Token数量: 100 ← 数量不一致!
可能原因:
- 代码逻辑错误
- targetTokens 被错误覆盖
排查方法:
- 检查
📋 重试Token列表是否正确 - 检查是否有其他代码修改了 targetTokens
问题3:重试后仍然失败
第1次执行:失败 3个
重试:失败 3个(相同的Token)
可能原因:
- 错误原因未解决:如未加入俱乐部
- 临时性错误:网络问题、服务器繁忙
- 配置问题:任务配置不正确
解决方法:
- 检查失败的具体错误信息
- 解决根本原因(如加入俱乐部)
- 调整任务配置或参数
技术实现
重试流程
用户点击"重试失败"
↓
handleRetryFailed() (BatchTaskPanel.vue)
↓
batchStore.retryFailedTasks()
↓
筛选失败的Token: filter(status === 'failed')
↓
输出详细日志(新增)
↓
startBatchExecution(failedTokenIds, tasks, true)
↓
执行失败的Token
数据流
taskProgress = {
'token1': { status: 'completed', ... },
'token2': { status: 'failed', ... }, ← 筛选
'token3': { status: 'completed', ... },
'token4': { status: 'failed', ... }, ← 筛选
'token5': { status: 'failed', ... }, ← 筛选
}
↓
failedTokenIds = ['token2', 'token4', 'token5']
↓
startBatchExecution(failedTokenIds, tasks, true)
↓
只执行 token2, token4, token5
日志格式说明
分隔线:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
作用:区分不同的日志块,提高可读性
信息格式:
🔄 开始重试失败任务 ← 主标题
📊 失败Token数量: 3 ← 统计信息
📋 失败Token列表: [...] ← 详细列表
测试场景
场景1:正常重试
前置条件:
- 执行100个Token
- 3个失败,97个成功
操作:
1. 点击"重试失败 (3个)"按钮
预期结果:
控制台输出:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
🔄 开始重试失败任务
📊 失败Token数量: 3
📋 失败Token列表: ['Token2', 'Token4', 'Token5']
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
🚀 开始批量执行任务 (重试)
📋 Token数量: 3
📋 重试Token列表: ['Token2', 'Token4', 'Token5']
验证:
✅ 数量一致
✅ Token列表一致
✅ 只执行3个Token
场景2:无失败任务
前置条件:
- 执行100个Token
- 全部成功
操作:
1. 点击"重试失败 (0个)"按钮(如果显示)
预期结果:
⚠️ 没有失败的任务需要重试
(或按钮禁用/隐藏)
场景3:页面刷新后重试
前置条件:
- 执行100个Token
- 3个失败
操作:
1. 刷新页面(F5)
2. 尝试点击"重试失败"按钮
预期结果:
⚠️ 没有失败的任务需要重试
(taskProgress 数据丢失)
建议:
添加持久化存储以支持刷新后重试
最佳实践
1. 重试前的检查
// ✅ 好的做法:检查是否有失败的任务
if (failedTokenIds.length === 0) {
console.warn('⚠️ 没有失败的任务需要重试')
return
}
// ❌ 不好的做法:不检查直接执行
await startBatchExecution(failedTokenIds, tasks, true)
2. 详细的日志输出
// ✅ 好的做法:输出详细信息
console.log(`📊 失败Token数量: ${failedTokenIds.length}`)
console.log(`📋 失败Token列表:`, failedTokenIds)
// ❌ 不好的做法:只输出数量
console.log(`重试 ${failedTokenIds.length} 个`)
3. 使用分隔线
// ✅ 好的做法:使用分隔线区分日志块
console.log(`━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━`)
console.log(`🔄 开始重试失败任务`)
console.log(`━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━`)
// ❌ 不好的做法:日志混在一起
console.log(`🔄 开始重试失败任务`)
未来改进
1. 持久化失败记录
// 将失败的Token保存到localStorage
const saveFailedTokens = (failedTokenIds) => {
localStorage.setItem('failedTokens', JSON.stringify({
tokenIds: failedTokenIds,
timestamp: Date.now()
}))
}
// 页面刷新后恢复失败记录
const loadFailedTokens = () => {
const saved = localStorage.getItem('failedTokens')
if (saved) {
const data = JSON.parse(saved)
// 检查是否过期(如24小时)
if (Date.now() - data.timestamp < 24 * 60 * 60 * 1000) {
return data.tokenIds
}
}
return []
}
2. 失败原因分析
// 统计失败原因
const failureReasons = failedTokenIds.map(tokenId => {
const progress = taskProgress.value[tokenId]
return {
tokenId,
error: progress.error,
failedTasks: Object.keys(progress.result || {}).filter(
taskId => !progress.result[taskId].success
)
}
})
console.log(`📊 失败原因统计:`, failureReasons)
3. 智能重试建议
// 分析失败原因并给出建议
const analyzeFailures = (failedTokenIds) => {
const clubErrors = failedTokenIds.filter(id =>
taskProgress.value[id].error?.includes('未加入俱乐部')
)
if (clubErrors.length > 0) {
console.warn(`⚠️ ${clubErrors.length} 个Token因未加入俱乐部失败`)
console.log(`💡 建议:请先让这些账号加入俱乐部再重试`)
}
}
相关版本
- v3.7.0: 首次添加自动重试功能
- v3.12.6: 增强重试日志输出(本版本)
总结
问题:
- ⚠️ 重试时日志信息不够详细
- ⚠️ 无法确认哪些Token被重试
- ⚠️ 难以诊断重试问题
改进:
- ✅ 添加详细的重试信息日志
- ✅ 显示失败Token数量和具体列表
- ✅ 使用分隔线提高可读性
- ✅ 重试模式下显示Token列表
效果:
- ✅ 用户可以清楚看到哪些Token被重试
- ✅ 便于验证重试功能是否正常工作
- ✅ 便于诊断重试问题
- ✅ 提高透明度和可信度
状态: ✅ 已改进
版本: v3.12.6