OkHttp - 启用日志

时间:2014-07-25 09:17:33

标签: android web-services http okhttp

我使用Retrofit来发出Http请求和Json解析,我喜欢打开调试日志的方法。日志允许查看正文请求,网址...这非常有用。由于Retrofit使用OkHttp,我想知道OkHttp是否也有办法为每个请求启用日志。

8 个答案:

答案 0 :(得分:24)

使用Interceptor,您可以定义以下类:

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();

答案 1 :(得分:13)

拦截器功能目前正在审核中,但您可以通过应用the 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);
如果您想了解更多内容,

A test会包含在拉取请求中。

我必须提前警告你使用它。拦截器API可能会有变化,因为它尚未合并。不要将它与生产代码一起使用,但它对于个人测试来说无害。

答案 2 :(得分:7)

还没有。但是正在开发的interceptors feature应该可以轻松实现。

答案 3 :(得分:3)

现在有一个Square(员工)的官方解决方案。 你可以试试: https://github.com/square/okhttp/tree/master/okhttp-logging-interceptor

答案 4 :(得分:1)

对于okhttp3

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

答案 5 :(得分:0)

您可以启用日志记录功能并使用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();

答案 6 :(得分:0)

为了更好地进行UI和OkHttp网络调用的调试,您可以使用 GANDER

之类的库

其他功能包括:

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

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

  3. 主要的Gander活动是在其自己的任务中启动的,允许它使用Android 7.x多窗口支持与主机应用程序UI一起显示。
  4. Gander提供以下变体
    • 持久性:将日志保存到磁盘,并且可以控制TTL
    • 在内存数据库中:日志将在应用程序生命周期内一直保存在内存中。
    • 无操作:此操作无效。因此,如果用户只希望在调试版本中使用Gander,则可以在不处理变量的情况下释放Compile NoOp,如果(Build.DEBUG)..etc

答案 7 :(得分:0)

我添加了一些有关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解释如何记录,因此在上面的示例中,消息仅被路由到INFO上的 Slf4j 记录器级别。