OkHttp - 开启日志记录

29

我使用Retrofit来进行HTTP请求和JSON解析,并且很喜欢其开启调试日志的方式。日志可以显示请求体、URL等信息,非常有用。由于Retrofit使用OkHttp,我想知道是否也有一种方法来启用OkHttp的每个请求的日志记录。

我使用了Retrofit来进行HTTP请求和JSON解析,并且喜欢它的调试日志功能。日志记录能够展示请求体、URL等信息,这非常有用。由于Retrofit使用OkHttp,因此我想知道是否也有一种方法来启用OkHttp的每个请求的日志记录。
9个回答

36

通过使用拦截器,您可以定义以下类:

class LoggingInterceptor implements Interceptor {
  @Override public Response intercept(Chain chain) throws IOException {
    Request request = chain.request();

    long t1 = System.nanoTime();
    Log.d("OkHttp", String.format("Sending request %s on %s%n%s",
        request.url(), chain.connection(), request.headers()));

    Response response = chain.proceed(request);

    long t2 = System.nanoTime();
    Log.d("OkHttp", String.format("Received response for %s in %.1fms%n%s",
        response.request().url(), (t2 - t1) / 1e6d, response.headers()));

    return response;
  }
}

并添加它:

OkHttpClient client = new OkHttpClient.Builder()
  .addInterceptor(new LoggingInterceptor())
  .build();

这个错误提示为“不支持的操作”。 - Aman Satija

17

拦截器功能目前正在审查中,但您可以通过应用 pull request 中的代码更改构建自己的okHttp版本以包含该功能。

您可以使用类似以下的代码来实现所需的功能

// Create an interceptor which catches requests and logs the info you want
RequestInterceptor logRequests= new RequestInterceptor() {
  public Request execute(Request request) {
    Log.i("REQUEST INFO", request.toString());
    return request; // return the request unaltered
  }
};

OkHttpClient client = new OkHttpClient();
List<RequestInterceptor> requestInterceptors = client.requestInterceptors();
requestInterceptros.add(logRequests);

这里有一个测试,如果您想了解更多,请查看。

我必须提前警告您关于使用它的事项。由于拦截器API尚未合并,因此可能会对其进行更改。不要将其用于生产代码,但它足够无害以进行个人测试。


7

目前还没有相关的内容。但是正在开发一个拦截器功能,这将使其变得更加容易。


1
该功能已经实现:https://github.com/square/okhttp/wiki/Interceptors - kotucz

5

1
你知道我怎么记录HTTP2帧吗?到目前为止,我看到的所有拦截器都只记录请求。 - Praveen
它是用 Kotlin 写的,而我需要 Java。 - President James K. Polk
@JamesKPolk 如果你真的需要Java版本,源代码已经在那里了,只需要翻译一下即可。 - Hoang Nguyen Huu

4

针对OkHttp3库

HttpLoggingInterceptor logging = new HttpLoggingInterceptor(message -> Log.d(YourClass.class.getSimpleName(), "OkHttp: " + message));
logging.setLevel(HttpLoggingInterceptor.Level.BODY);
okHttpClient.getHttpClient().interceptors().add(logging);

3

你可以启用日志记录并与Timber集成,以便仅在调试时记录日志。

HttpLoggingInterceptor httpLoggingInterceptor = new HttpLoggingInterceptor(new HttpLoggingInterceptor.Logger() {
      @Override
      public void log(String message) {
        Timber.tag("OkHttp: ");
        Timber.i(message);
      }
    }).setLevel(HttpLoggingInterceptor.Level.BODY);

   client = new OkHttpClient.Builder()
      .addInterceptor(httpLoggingInterceptor)
      .build();

3

我补充一些关于OkHttp3的信息,因为它支持开箱即用的日志记录功能。

首先,请确保同时使用了这两个依赖项:OkHttp3的主要包和包含日志记录实现的特定包。这里我使用的是 3.14.6 版本。

<dependency>
    <groupId>com.squareup.okhttp3</groupId>
    <artifactId>okhttp</artifactId>
    <version>3.14.6</version>
</dependency>
<dependency>
    <groupId>com.squareup.okhttp3</groupId>
    <artifactId>logging-interceptor</artifactId>
    <version>3.14.6</version>
</dependency>

然后正确配置您的 OkHttp 客户端。

...
import okhttp3.logging.HttpLoggingInterceptor;
...
HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor(message -> logger.info(message));
interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);

OkHttpClient okHttpClient = new OkHttpClient.Builder()
        .addNetworkInterceptor(interceptor)
        .build();

主要思路是要向HttpLoggingInterceptor解释如何记录日志,因此在上面的示例中,消息只是路由到一个Slf4j记录器以INFO级别。

1

为了更好地UI和调试OkHttp网络调用,您可以使用类似GANDER的库。

其他功能包括:

  1. 使用Gander的应用程序将显示一个通知,显示正在进行的HTTP活动的摘要。点击通知会启动完整的Gander UI。应用程序可以选择抑制通知,并从其自己的界面直接启动Gander UI。 HTTP交互及其内容可以通过共享意图导出。

  2. 搜索HTTP活动以及请求和响应

  3. Gander主要活动在自己的任务中启动,允许它使用Android 7.x多窗口支持与主机应用程序UI并排显示。
  4. Gander提供以下变体
    • 持久性:将日志保存到磁盘上,可以控制TTL
    • 内存数据库:只要应用程序生命周期,日志就会在内存中。
    • No Op:什么也不做。因此,如果用户想要Gander仅在调试构建中,则可以发布编译NoOp而不必处理变体,if(Build.DEBUG) ..等等

0

你可以使用以下代码添加日志:

   public final OkHttpClient client = new OkHttpClient.Builder()
       .addInterceptor(new HttpLoggingInterceptor())
       .cache(new Cache(cacheDir, cacheSize))
       .build();

将使用默认配置:

Logger DEFAULT = message -> Platform.get().log(INFO, message, null);


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接