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

简介: 现在应该有许多人都是使用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月前
|
安全 Linux 网络安全
/var/log/secure日志详解
Linux系统的 `/var/log/secure` 文件记录安全相关消息,包括身份验证和授权尝试。它涵盖用户登录(成功或失败)、`sudo` 使用、账户锁定解锁及其他安全事件和PAM错误。例如,SSH登录成功会显示&quot;Accepted password&quot;,失败则显示&quot;Failed password&quot;。查看此文件可使用 `tail -f /var/log/secure`,但通常只有root用户有权访问。
115 4
|
1月前
|
运维 监控 数据可视化
日志服务 HarmonyOS NEXT 日志采集最佳实践
鸿蒙操作系统(HarmonyOS)上的日志服务(SLS)SDK 提供了针对 IoT、移动端到服务端的全场景日志采集、处理和分析能力,旨在满足万物互联时代下应用的多元化设备接入、高效协同和安全可靠运行的需求。
116782 10
|
1月前
|
监控 Linux 网络安全
/var/log/auth.log日志说明
`/var/log/auth.log`是Linux系统记录身份验证和授权事件的日志文件,包括登录尝试、SSH连接、sudo操作等。系统管理员可通过它监控用户登录、检查失败尝试、跟踪SSH活动、查看sudo/su操作及PAM活动。日志内容可能因系统配置而异,可能存在于其他日志文件中。分析这些日志可使用`tail`、`grep`等命令或专用日志分析工具。了解系统和其服务详情有助于提取有用信息。
56 2
|
1月前
|
安全 Ubuntu Unix
/var/log/syslog日志说明
`/var/log/syslog`是Unix和Linux的日志文件,记录系统事件和消息,由`syslogd`或`rsyslogd`生成。日志条目含时间戳、主机名、PID、日志级别(如DEBUG、ERROR)和事件描述。内容涵盖系统启动/关闭、硬件错误、网络、用户登录、安全事件等。查看日志可使用`cat`、`tail`、`less`或`grep`命令。不过,不同Linux发行版可能有变,如Ubuntu使用`journald`和`journalctl`。
62 3
|
6天前
|
C++
JNI Log 日志输出
JNI Log 日志输出
14 1
|
6天前
|
存储 运维 大数据
聊聊日志硬扫描,阿里 Log Scan 的设计与实践
泛日志(Log/Trace/Metric)是大数据的重要组成,伴随着每一年业务峰值的新脉冲,日志数据量在快速增长。同时,业务数字化运营、软件可观测性等浪潮又在对日志的存储、计算提出更高的要求。
|
12天前
|
XML Java Maven
Springboot整合与使用log4j2日志框架【详解版】
该文介绍了如何在Spring Boot中切换默认的LogBack日志系统至Log4j2。首先,需要在Maven依赖中排除`spring-boot-starter-logging`并引入`spring-boot-starter-log4j2`。其次,创建`log4j2-spring.xml`配置文件放在`src/main/resources`下,配置包括控制台和文件的日志输出、日志格式和文件切分策略。此外,可通过在不同环境的`application.yml`中指定不同的log4j2配置文件。最后,文章提到通过示例代码解释了日志格式中的各种占位符含义。
|
12天前
|
运维 监控 Go
Golang深入浅出之-Go语言中的日志记录:log与logrus库
【4月更文挑战第27天】本文比较了Go语言中标准库`log`与第三方库`logrus`的日志功能。`log`简单但不支持日志级别配置和多样化格式,而`logrus`提供更丰富的功能,如日志级别控制、自定义格式和钩子。文章指出了使用`logrus`时可能遇到的问题,如全局logger滥用、日志级别设置不当和过度依赖字段,并给出了避免错误的建议,强调理解日志级别、合理利用结构化日志、模块化日志管理和定期审查日志配置的重要性。通过这些实践,开发者能提高应用监控和故障排查能力。
88 1
|
14天前
|
弹性计算 运维 Shell