Files
xyzw_web_helper/MD说明文件夹/问题修复-重试失败日志增强v3.12.6.md
2025-10-17 20:56:50 +08:00

13 KiB
Raw Blame History

问题修复 - 重试失败日志增强 v3.12.6

版本: v3.12.6
日期: 2025-10-08
类型: 问题修复 / 日志增强

问题描述

用户反馈:

"失败重试的时候,没有把上次运行失败的项添加进去"

可能的问题

  1. 重试时没有正确筛选失败的Token
  2. 重试时执行了所有Token而不是只执行失败的
  3. 日志信息不够详细无法确认哪些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执行批量任务

  1. 开始执行批量任务
  2. 等待执行完成
  3. 观察统计信息:
    成功: 97
    失败: 3
    

步骤2点击"重试失败"按钮

  1. 点击"重试失败 (3个)"按钮
  2. 打开浏览器控制台F12
  3. 观察日志输出

步骤3验证日志信息

预期日志

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
🔄 开始重试失败任务
📊 失败Token数量: 3
📋 失败Token列表: ['Token1', 'Token2', 'Token3']
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
🚀 开始批量执行任务 (重试)
📋 Token数量: 3
📋 重试Token列表: ['Token1', 'Token2', 'Token3']

验证要点

  • 失败Token数量 = 重试Token数量 = 3
  • 失败Token列表与重试Token列表一致
  • 只执行失败的3个Token不执行成功的97个

常见问题诊断

问题1显示"没有失败的任务需要重试"

控制台输出:
⚠️ 没有失败的任务需要重试

可能原因

  1. 页面已刷新taskProgress 数据丢失
  2. 已全部重试成功:所有失败任务都已重试成功
  3. 进度数据被清空:某个操作清空了 taskProgress

解决方法

  • 重新执行批量任务
  • 不要刷新页面
  • 失败后立即重试

问题2重试的Token数量不对

预期3个失败
实际重试了100个

控制台输出:
📊 失败Token数量: 3
📋 Token数量: 100  ← 数量不一致!

可能原因

  • 代码逻辑错误
  • targetTokens 被错误覆盖

排查方法

  • 检查 📋 重试Token列表 是否正确
  • 检查是否有其他代码修改了 targetTokens

问题3重试后仍然失败

第1次执行失败 3个
重试:失败 3个相同的Token

可能原因

  1. 错误原因未解决:如未加入俱乐部
  2. 临时性错误:网络问题、服务器繁忙
  3. 配置问题:任务配置不正确

解决方法

  • 检查失败的具体错误信息
  • 解决根本原因(如加入俱乐部)
  • 调整任务配置或参数

技术实现

重试流程

用户点击"重试失败"
      ↓
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