应为每次请求生成唯一requestid并贯穿所有重试日志,记录重试序号、http状态码、耗时、错误原因、是否终止等结构化字段,同时在重试前记录策略依据(如错误类型、延迟时间、剩余次数)。

在 JavaScript 请求重试逻辑中,想在日志里清晰记录每次重试的状态,关键不是只打一条“重试了”,而是让每条日志自带上下文:请求标识、当前重试次数、HTTP 状态、错误原因、耗时、是否最终成功等。这样排查问题时一眼就能看出是网络抖动、服务端超时,还是某次偶然 503。
给每次请求打唯一 ID,串联所有日志
没有 ID 的日志是碎片。建议用 UUID 或时间戳+随机数 为每次请求(含所有重试)生成一个 requestID,并在所有相关日志中带上它:
const requestId = `req_${Date.now()}_${Math.random().toString(36).substr(2, 6)}`;
console.log(`[REQ:${requestId}] 尝试第 1 次请求: GET /api/data`);
// ... 请求失败后
console.log(`[REQ:${requestId}] 第 1 次重试失败: status=503, elapsed=1247ms`);
console.log(`[REQ:${requestId}] 第 2 次重试成功: status=200, elapsed=892ms`);记录核心状态字段,不只记“成功/失败”
单靠 console.log('重试成功') 没信息量。每次日志至少包含以下字段:
- 重试序号(如 #1、#2)——区分是首次还是第 N 次
- HTTP 状态码(或网络错误名,如 'TypeError: failed to fetch')
- 响应耗时(从 send 到收到响应/拒绝的时间,单位 ms)
- 响应体摘要(可选,如 error.message 或 response.statusText,避免打太长)
- 是否终止重试(如 “已达到最大重试次数 3 次” 或 “收到 4xx 错误,不再重试”)
用结构化方式输出,方便后续检索
别只用字符串拼接。用对象 + console.log({}),浏览器和日志系统(如 Sentry、ELK)能更好解析:
console.log({
type: 'fetch_retry',
requestId,
attempt: currentAttempt,
url: 'https://api.example.com/v1/users',
method: 'GET',
status: response?.status ?? 'network_error',
durationMs: Date.now() - startTime,
error: err?.message,
isFinal: currentAttempt >= maxRetries || shouldStopRetrying(err)
});这样在浏览器控制台点开对象就能展开看细节,导出日志时也保留字段语义。
补充上下文:重试策略本身也要留痕
在重试开始前,记一条“启动重试”的日志,说明策略依据:
- 触发重试的原因(如 status 502 / timeout / aborted)
- 下次重试延迟(如 “将在 1000ms 后进行第 2 次重试”)
- 剩余重试次数(如 “还剩 2 次机会”)
例如:console.log(`[REQ:${requestId}] 触发重试:502 Bad Gateway → 1s 后重试(剩余 2 次)`);
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











