retrofit工具增加http调用日志输出

Retrofit 是一个很好用的http调用组件。内置的其实也是okhttp。把okhttp封装了一下,让日常的业务交互对http调用的感知变小。

一个http调用只需要一行代码就可以了。具体的Retrofit的用法不在这里阐述。自行百度。

这里只讲解如何让Retrofit能够打印http调用的相关参数日志。开讲:

Retrofit每次调用的时候都会用到OKhttpcilent这个客户端,它默认的client是没有打印日志功能的,查看Retrofit的源码:

public final class Retrofit
{
    public static final class Builder
    {

        public Builder client(OkHttpClient client)
        {
            return callFactory((okhttp3.Call.Factory)Utils.checkNotNull(client, "client == null"));
        }

        public Builder callFactory(okhttp3.Call.Factory factory)
        {
            callFactory = (okhttp3.Call.Factory)Utils.checkNotNull(factory, "factory == null");
            return this;
        }

可以看到这里是支持传入自定义的OKhttpclient的,所以我们就构建一个可以打印日志的OKhttpclient传进去,然后让每次Retrofit的调用都可以打印日志。

那么如何构建可以打印日志的OKhttpclient呢?我们来查看OKhttpclient的源码,可以找到如下方法:

        public Builder addInterceptor(Interceptor interceptor)
        {
            interceptors.add(interceptor);
            return this;
        }

这个方法可以给client添加各种各样的拦截器,然后达到自己的一些需求。我们要在这里添加一个日志的拦截器,然后每次client的一些http步骤的调用都会调用这个拦截器来做日志输出。

日志的拦截器需要引入jar包(这个jar包只有一个HttpLoggingInterceptor类。。。搞不懂为什么不直接放到okhttp包里。):

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

然后我们创建一个自己的HttpLoggingInterceptor放到自定义的client中,然后设置到Retrofit中。这样我们的Retrofit就可以打印日志了。具体的实现代码如下:

初始化Retrofit并设置可以打印日志的OKhttpclient:

/**
* 调用第三方服务
*
* @param baseURL
* @param service
* @return
*/
public static <T> T start(String baseURL, Class<T> service) {
HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor().setLevel(HttpLoggingInterceptor.Level.BODY);
OkHttpClient client = new OkHttpClient.Builder().addInterceptor(loggingInterceptor).build();
return new Retrofit.Builder().baseUrl(baseURL).client(client).addConverterFactory(GsonConverterFactory.create()).build().create(service);
}

这样设置之后我们就可以打印Retrofit的http调用日志了。 代码中有一个 HttpLoggingInterceptor.Level 的枚举。这里是设置要打印的日志的内容的。简单介绍下:

HttpLoggingInterceptor.Level.NONE  不打印,

HttpLoggingInterceptor.Level.BASIC 请求和响应,

HttpLoggingInterceptor.Level.HEADERS 请求和响应+头,

HttpLoggingInterceptor.Level.BODY 请求和响应+头+体,

大家可以根据自己的需要来打印。

这样设置之后再本地启动调试的时候是可以在控制台上看到日志的。但是如果log日志是要输出到日志文件的时候就不好使了。 因为拦截器默认的是输出到控制台。

那么如何解决这个问题?我们来看HttpLoggingInterceptor的源码:

public final class HttpLoggingInterceptor
    implements Interceptor
{
    public static interface Logger
    {

        public abstract void log(String s);

        public static final Logger DEFAULT = new Logger() {

            public void log(String message)
            {
                Platform.get().log(message);
            }
        };
    }

这里有个输出日志的接口的实现类, 我们可以实现HttpLoggingInterceptor.Logger接口,然后重写它的log方法,来用自己的log输出工具来输出。这样就可以解决这个问题。具体如何重写。。。

连重写都不会还写什么java代码。。。。

时间: 2024-11-08 20:06:00

retrofit工具增加http调用日志输出的相关文章

WebAPI+NLog实现接口调用日志输出

在生产环境下,经常需要监测查看WebAPI接口的调用情况,日志就成了必不可少的手段之一,本文采用NLog实现WebAPI的日志记录. 环境 版本 操作系统 Windows 10 prefessional 编译器 Visual Studio 2015 update3 创建WebAPI 创建WebAPI项目,选择ASP.NET 4.5.2模板中的WebAPI模板. 引用NLog类库 打开项目的NuGet包管理器,搜索NLog,为项目添加程序包引用. 修改项目配置文件 在webAPI项目的Web.co

HAproxy增加日志记录功能和自定义日志输出内容、格式

一.增加haproxy日志记录功能 1.1 由于数据分析的需要,我们必须打开haproxy日志,记录相关信息. 在配置前,我们先来了解一下日志的level:local0-local7 16-23保留为本地使用 emerg 0 系统不可用     alert 1 必须马上采取行动的事件     crit 2 关键的事件     err 3 错误事件     warning 4 警告事件     notice 5 普通但重要的事件     info 6 有用的信息     debug 7 调试信息

web项目Log4j日志输出路径配置问题

问题描述:一个web项目想在一个tomcat下运行多个实例(通过修改war包名称的实现),然后每个实例都将日志输出到tomcat的logs目录下实例名命名的文件夹下进行区分查看每个实例日志,要求通过尽可能少的改动配置文件,最好修改实例名后可以不修改log4j的配置文件. 实现分析:一般实现上面需求,需要在修改完war包名称之外要再做下面配置: 1.修改每个实例名下web.xml中参数webAppRootKey为不同值.同一个tomcat下运行多个web应用时,该值相同的话,运行时会抛异常. <c

Eclipse中将tomcat日志输出重定向

在开发过程中,使用Eclipse工具启动tomcat或者在项目调试过程中,需要在控制台监控输出的日志信息,但是在Eclipse的控制台中只会保留最近的一段日志信息,而之前的信息则会消失,所以完全有必要将日志的输出进行重定向,操作步骤如下: 1.在Eclipse中依次点击Run->Run Configurations...(或者Debug Configurations...),进入如下配置页面: 在上图中Apache Tomcat菜单上双击(或右键New)增加Tomcat实例信息. 2.点击新增加

方法级别的java日志输出控制(二)集群

在方法级别的java日志输出控制(一)这篇文章中主要讨论了通过properties配置文件以及AOP技术批量控制方法级别的日志输出. 用properties配置文件的好处是不用更改程序即可控制日志的输出,然而大型的应用通常是分布式的,会有很多的服务器,需要更改全部服务器上的配置文件,然后再重启应用.这将会是一件非常麻烦的事情.事实上在大型集群应用中有更好的方法实现他.zookeeper的特性决定着它有一个应用场景就是集群配置中心.本文不介绍zookeeper原理以及搭建,将直接使用zookeep

Log4Qt快速入门——Log4Qt日志输出重定向源码解析

Log4Qt快速入门--Log4Qt日志输出重定向源码解析 一.Appender简介 1.Appender简介 Appender是所有Appender的抽象类,是对记录日志形式的抽象.Log4Qt(Qt4版本)中Appender继承体系如下: 2.Appender接口 virtual Filter *filter() const = 0; virtual QString name() const = 0; virtual Layout *layout() const = 0; virtual b

9 个技巧,解决 K8s 中的日志输出问题

作者 | 元乙??阿里云存储服务技术专家 导读:近年来,越来越多的同学咨询如何为 Kubernetes 构建一个日志系统,或者是来求助在此过程中遇到一系列问题如何解决,授人以鱼不如授人以渔,于是作者想把这些年积累的经验以文章的形式发出来,让看到文章的同学少走弯路.K8s 日志系列文章内容偏向落地实操以及经验分享,且内容会随着技术的迭代而不定期更新,本文为该系列文章的第 3 篇. 第一篇:<6 个 K8s 日志系统建设中的典型问题,你遇到过几个?> 第二篇:<一文看懂 K8s 日志系统设计

python日志输出

import logging logger = logging.getLogger()  #生成一个日志对象,()内为日志对象的名字,可以不带,名字不给定就是root handler=logging.FileHandler("Log_test.txt")  #生成一个handler(处理器), #formatter 下面代码指定日志的输出格式 fmt = '%(asctime)s - %(filename)s:%(lineno)s - %(name)s - %(message)s' f

日志输出--C#

using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; //添加引用,并导入命名空间 using System.Management; using System.Net.NetworkInformation; using System.IO; //日志输出类 public void SWriter(string ipname) { stri