开源项目——让okhttp3优雅地打印日志

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 现在应该有许多人都是使用okhttp来作为项目的网络请求的底层库,那么,还有人在沿用着对每个请求在执行前后手动打印一下参数及地址这种古老的日志打印方式吗?okhttp的灵活而强大的特点之一,就是其提供了一个拦截器接口,使得我们在打印日志时极为方便,并且对我们的接口代码无入侵性。

现在应该有许多人都是使用okhttp来作为项目的网络请求的底层库,那么,还有人在沿用着对每个请求在执行前后手动打印一下参数及地址这种古老的日志打印方式吗?okhttp的灵活而强大的特点之一,就是其提供了一个拦截器接口,使得我们在打印日志时极为方便,并且对我们的接口代码无入侵性。
本篇文章介绍一个okhttp3的日志打印库,无论是使用古老方式来打印日志的,还是使用square官方okhttp3的日志库的,都可以一看。

okhttp3-loginterceptor是用于okhttp3的一个日志打印库,小巧轻量,相比square提供的okhttp3的logging-interceptor,它对每个请求和响应都进行编号 ,并且对于json的请求或响应内容,还将打印出格式化的JSON内容,而除了依赖okhttp3之外,它不会添加任何其他第三方依赖。那么它是如何小巧轻量而又不会向项目引入其他依赖的呢?等下我们在文中会提到,下面先开始介绍它的使用。

快速入门

okhttp3-loginterceptor在github上的项目地址为:https://github.com/parkingwang/okhttp3-loginterceptor。引入方式很简单,只需几行代码。如下:

声明依赖

添加依赖,以下的latest.integration建议换为当前最新版本的具体版本号。

compile 'com.parkingwang:okhttp3-loginterceptor:latest.integration'

添加代码

然后在创建OkHttpClient对象的代码中添加其拦截器实例,代码如下:

OkHttpClient okHttpClient = new OkHttpClient.Builder()
        .addInterceptor(new LogInterceptor()).build();

这样就完成了。然后你就可以看到类似这样的日志了:

W/OkHttp: [4 request]--> GET https://api.github.com/users/defunkt http/1.1
W/OkHttp: [4 request]--> END GET
W/OkHttp: [5 request]--> GET https://api.github.com/zen http/1.1
W/OkHttp: [5 request]--> END GET
W/OkHttp: [6 request]--> GET https://api.github.com/users/msdx http/1.1
W/OkHttp: [6 request]--> END GET
W/OkHttp: [4 response]<-- 200 OK https://api.github.com/users/defunkt (1335ms)
W/OkHttp: [4 response]Server: GitHub.com
W/OkHttp: [4 response]Date: Thu, 12 Jan 2017 04:01:43 GMT
W/OkHttp: [4 response]Content-Type: application/json; charset=utf-8
W/OkHttp: [4 response]Transfer-Encoding: chunked

文章这就结束了?当然不,既然是专门介绍的文章当然得好好写写。

详细介绍

适当地添加日志拦截器

首先,我们打印日志一般都是在debug的时候才需要,对于release即发布出去的版本,是不需要打印请求的日志的,所以通常我们会这样写代码:

        final OkHttpClient.Builder clientBuilder = new OkHttpClient.Builder();
        if (BuildConfig.DEBUG) {
            clientBuilder.addInterceptor(new LogInterceptor());
        }
        return clientBuilder
            //.XXX 省略一大堆设置其他参数的代码
            .build();

关于JSON格式化输出

前面提到,okhttp3-loginterceptor除了okhttp3之外,不会向项目添加其他第三方依赖,尽量做到小巧轻量。所以当判断请求或响应的contentType的内容为JSON数据而尝试格式化输出JSON内容时,是采用反射的方式。在第一次调用JSON格式化的时候,会判断当前使用的是哪一个JSON解析库,然后调用其相关方法来格式化JSON。目前支持常用的JSON解析库,包括:gson, fastjson, moshi, org.json。当你的项目不包含以上这些库时,则不会进行格式化的JSON数据输出。

混淆规则

okhttp3-loginterceptor由于使用反射来调用前面所提到的json解析库,而本身并没有对它们声明依赖。所以需要添加以下的混淆规则:

-dontwarn com.parkingwang.okhttp3.LogInterceptor.formatter.*

最后

okhttp3-loginterceptor是我基于需要的功能,参考okhttp3-logging-interceptor的代码而封装的一个库。
首先,我们与服务器的数据交互使用json方式比较多,在开发或调试时需要更能直观地查看json数据,所以我封装了格式化输出json数据的功能。
其次,在应用中,经常是多个请求同时进行。通过日志中的线程名来判断哪一行是属于哪个响应,对应于哪个请求相当不便,所以我在每一行添加了一个前缀,也是为了更直观地查看日志。
我设想的是让它只做最需要的事,所以没添加也没打算添加其他一些日志库的酷炫输出日志格式的功能。

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
1月前
|
存储 关系型数据库 MySQL
|
15天前
|
监控
查看服务器/IIS日志、log、访问信息基本方法
除了手动查看,你也可以使用日志分析工具,如Log Parser、AWStats等,这些工具可以帮助你更方便地分析日志数据。
8 1
|
22天前
|
Java 测试技术 Apache
《手把手教你》系列基础篇(八十六)-java+ selenium自动化测试-框架设计基础-Log4j实现日志输出(详解教程)
【7月更文挑战第4天】Apache Log4j 是一个广泛使用的 Java 日志框架,它允许开发者控制日志信息的输出目的地、格式和级别。Log4j 包含三个主要组件:Loggers(记录器)负责生成日志信息,Appenders(输出源)确定日志输出的位置(如控制台、文件、数据库等),而 Layouts(布局)则控制日志信息的格式。通过配置 Log4j,可以灵活地定制日志记录行为。
33 4
|
23天前
|
运维 Java Apache
Java中的日志框架:Log4j与SLF4J详解
Java中的日志框架:Log4j与SLF4J详解
|
1月前
|
SQL 运维 关系型数据库
|
1月前
|
存储 关系型数据库 MySQL
|
20天前
|
XML Java 测试技术
《手把手教你》系列基础篇(八十八)-java+ selenium自动化测试-框架设计基础-Log4j 2实现日志输出-下篇(详解教程)
【7月更文挑战第6天】本文介绍了如何使用Log4j2将日志输出到文件中,重点在于配置文件的结构和作用。配置文件包含两个主要部分:`appenders`和`loggers`。`appenders`定义了日志输出的目标,如控制台(Console)或其他文件,如RollingFile,设置输出格式和策略。`loggers`定义了日志记录器,通过`name`属性关联到特定的类或包,并通过`appender-ref`引用`appenders`来指定输出位置。`additivity`属性控制是否继承父logger的配置。
22 0
|
1月前
|
运维 Serverless API
Serverless 应用引擎产品使用合集之sls日志告警调用函数计算,出现抛出的结果异常,是什么原因
阿里云Serverless 应用引擎(SAE)提供了完整的微服务应用生命周期管理能力,包括应用部署、服务治理、开发运维、资源管理等功能,并通过扩展功能支持多环境管理、API Gateway、事件驱动等高级应用场景,帮助企业快速构建、部署、运维和扩展微服务架构,实现Serverless化的应用部署与运维模式。以下是对SAE产品使用合集的概述,包括应用管理、服务治理、开发运维、资源管理等方面。
|
21天前
|
JSON 应用服务中间件 开发工具
Ngnix的http块自定义服务日志,access.log和error.log,log_format指定日志输出格式设置
Ngnix的http块自定义服务日志,access.log和error.log,log_format指定日志输出格式设置