如何记录OkHttpClient在Android应用中的请求重试日志?
如何记录OkHttpClient的静默重试请求?
OkHttp开启retryOnConnectionFailure后,重试逻辑会在RetryAndFollowUpInterceptor内部静默执行,不过可以通过以下两种方案监控并记录这些重试操作:
方案1:使用EventListener监听重试事件
OkHttp提供的EventListener抽象类可以监听请求生命周期的各个阶段,连接失败、请求失败等事件会在重试触发前被回调,结合请求唯一标识就能追踪重试行为:
public class RetryLogger extends EventListener { private String requestId; @Override public void callStart(Call call) { requestId = UUID.randomUUID().toString(); Log.d("OkHttpRetry", "请求[" + requestId + "]启动"); } @Override public void connectFailed(Call call, InetSocketAddress address, Proxy proxy, Protocol protocol, IOException e) { Log.d("OkHttpRetry", "请求[" + requestId + "]连接失败,即将触发重试"); } @Override public void callFailed(Call call, IOException e) { Log.d("OkHttpRetry", "请求[" + requestId + "]重试耗尽,最终失败"); } @Override public void callEnd(Call call) { Log.d("OkHttpRetry", "请求[" + requestId + "]完成(含重试后成功的情况)"); } }
将这个EventListener绑定到OkHttpClient:
OkHttpClient client = new OkHttpClient.Builder() .retryOnConnectionFailure(true) .eventListener(new RetryLogger()) .build();
方案2:用网络拦截器统计重试次数
网络拦截器(addNetworkInterceptor)会在每次网络请求(包括重试)时执行,通过它可以记录每次请求的发送行为,从而统计重试次数:
public class RetryCountInterceptor implements Interceptor { @Override public Response intercept(Chain chain) throws IOException { Request request = chain.request(); String requestId = request.tag(String.class); if (requestId == null) { requestId = UUID.randomUUID().toString(); request = request.newBuilder().tag(String.class, requestId).build(); } AtomicInteger retryCount = new AtomicInteger(1); if (request.tag(AtomicInteger.class) != null) { retryCount = (AtomicInteger) request.tag(AtomicInteger.class); retryCount.incrementAndGet(); } else { request = request.newBuilder().tag(AtomicInteger.class, retryCount).build(); } Log.d("OkHttpRetry", "请求[" + requestId + "]第" + retryCount.get() + "次发送"); try { Response response = chain.proceed(request); Log.d("OkHttpRetry", "请求[" + requestId + "]第" + retryCount.get() + "次发送成功"); return response; } catch (IOException e) { Log.d("OkHttpRetry", "请求[" + requestId + "]第" + retryCount.get() + "次发送失败,触发重试"); throw e; } } }
绑定到客户端时使用网络拦截器:
OkHttpClient client = new OkHttpClient.Builder() .retryOnConnectionFailure(true) .addNetworkInterceptor(new RetryCountInterceptor()) .build();
注意事项
- EventListener方式能精准捕捉重试触发的具体原因(如连接超时、DNS解析失败等),适合排查问题的场景
- 网络拦截器方式可以直接统计实际的请求发送次数,适合简单的重试计数需求
- 不建议通过反射获取
RetryAndFollowUpInterceptor内部的重试计数,OkHttp内部API可能随版本变更导致兼容性问题
内容的提问来源于stack exchange,提问作者Xiaoqian
相关产品推荐
相关产品推荐

