JavaScript请求重试日志埋点需在每次失败后立即上报,包含接口路径、方法、重试次数、错误类型、状态码、错误信息和时间戳,并通过request_id归因、内存队列降级保障可靠性。

在 JavaScript 中实现请求重试时,记录每次失败的日志埋点,核心是:在每次重试前(或失败回调中)主动上报一条带上下文的错误日志,且确保每条日志能区分「第几次失败」和「失败原因」。
明确失败触发时机
不要只在最终放弃重试时才打日志。应在每次请求返回非成功状态(如 status >= 400、网络异常、超时)后立即记录,此时重试逻辑尚未执行下一次请求,上下文最完整。
- 使用 fetch 时,在
catch或response.ok === false分支中打点 - 使用 axios 时,在
.catch()或response.status >= 400的响应拦截器里打点 - 避免在重试计时器(
setTimeout)外层统一打日志——会丢失本次失败的具体响应信息
日志内容需包含关键维度
一条有效的失败埋点日志至少应包含:
-
接口路径(如
/api/user/profile) - HTTP 方法(GET/POST)
- 重试次数(从 1 开始计数,不是剩余次数)
-
错误类型(
"network"/"timeout"/"http_error"/"parse_error") - 状态码(如 502、0(网络断开)、-1(超时))
-
简要错误信息(如
response.statusText或err.message) -
时间戳(建议用
Date.now())
示例结构(供前端日志 SDK 消费):
立即学习“Java免费学习笔记(深入)”;
{
"event": "request_fail",
"url": "/api/order/submit",
"method": "POST",
"retry_count": 2,
"error_type": "http_error",
"status": 503,
"msg": "Service Unavailable",
"ts": 1718234567890
}
避免重复或遗漏:绑定重试上下文
多次重试属于同一业务动作,需保证日志可归因。推荐做法:
- 为每次重试请求生成唯一 request_id(如
crypto.randomUUID()或时间戳+随机数),并在所有相关日志中透传 - 将重试次数作为闭包变量或 Promise 链参数传递,不依赖全局计数器(易被并发请求干扰)
- 如果使用封装的
retryFetch(url, options, { maxRetries: 3 }),把retryCount作为内部参数传入失败回调
注意日志上报的可靠性
失败时网络可能已不稳定,直接调用 fetch 上报日志可能再次失败。建议:
- 对日志上报本身也做轻量级降级:失败则存入内存队列,待后续网络恢复时补发(可用
navigator.onLine监听) - 限制日志队列长度(如最多缓存 20 条),避免内存泄漏
- 避免在日志中记录敏感字段(如 token、手机号),脱敏后再上报


















