Okhttp中自带的日志拦截器 HttpLoggingInterceptor 实在是不好用,日志太多太乱,所以想要有好看、简洁的日志打印就要靠自定义了,下面分享我参照 HttpLoggingInterceptor 写的自定义日志打印拦截器,分为java版本和kotlin版本:

1、kotlin:

class CustomLogInterceptor : Interceptor {override fun intercept(chain: Interceptor.Chain): Response {val request = chain.request()val requestLog = generateRequestLog(request)val response = chain.proceed(request)val responseLog = generateResponseLog(response)LogUtils.w(requestLog.plus(responseLog))return response}private fun generateResponseLog(response: Response?): String {if (response == null) {return ""}return "Response Time-->:${TimeUtils.millis2String(System.currentTimeMillis())} \r\n Response Result ${if (response.code != 200)response.codeelse""} -->:${getResponseText(response)}"}private fun generateRequestLog(request: Request?): String {if (request == null) {return ""}val requestParams = getRequestParams(request)val needPrintRequestParams = requestParams.contains("IsFile").not()return "自定义日志打印 \r\n Request Time-->:${TimeUtils.millis2String(System.currentTimeMillis())} \r\n Request Url-->:${request.method} ${request.url} \r\n Request Header-->:${getRequestHeaders(request)} \r\n Request Parameters-->:${if (needPrintRequestParams)requestParamselse"文件上传,不打印请求参数"} \r\n "}@Deprecated("unused")private fun printInfo(request: Request?, response: Response?) {if (request != null && response != null) {val requestParams = getRequestParams(request)val needPrintRequestParams = requestParams.contains("IsFile").not()val logInfo ="自定义日志打印 \r\n Request Url-->:${request.method} ${request.url} \r\n Request Header-->:${getRequestHeaders(request)} \r\n Request Parameters-->:${if (needPrintRequestParams)requestParamselse"文件上传,不打印请求参数"} \r\n Response Result ${if (response.code != 200)response.codeelse""} -->:${getResponseText(response)}"LogUtils.w(logInfo)}}/*** 获取请求参数*/private fun getRequestParams(request: Request): String {var str: String? = nulltry {request.body?.let {val buffer = Buffer()it.writeTo(buffer)val charset = it.contentType()?.charset(Charset.forName("UTF-8"))?: Charset.forName("UTF-8")str = buffer.readString(charset)}} catch (e: Exception) {e.printStackTrace()}return if (str.isNullOrEmpty()) "Empty!" else str!!}private fun getRequestHeaders(request: Request): String {val headers = request.headersreturn if (headers.size > 0) {headers.toString()} else {"Empty!"}}/*** 获取返回数据字符串*/private fun getResponseText(response: Response): String {try {response.body?.let {val source = it.source()source.request(Long.MAX_VALUE)val buffer = source.bufferval charset = it.contentType()?.charset(Charset.forName("UTF-8"))?: Charset.forName("UTF-8")if (it.contentLength().toInt() != 0) {buffer.clone().readString(charset).let { result ->return result}}}} catch (e: Exception) {e.printStackTrace()}return "Empty!"}
}

2、Java:

public class CustomLogInterceptor implements Interceptor {@Overridepublic Response intercept(Chain chain) throws IOException {Request request = chain.request();Response response = chain.proceed(request);printInfo(request, response);return response;}private void printInfo(Request request, Response response) {if (request != null && response != null) {String logInfo = "自定义日志打印".concat(" \r\n ").concat("Request Url-->:").concat(request.method()).concat(" ").concat(request.url().toString()).concat(" \r\n ").concat("Request Header-->:").concat(getRequestHeaders(request)).concat(" \r\n ").concat("Request Parameters-->:").concat(getRequestParams(request)).concat(" \r\n ").concat("Response Result-->:").concat(getResponseText(response));Logger.w(logInfo);}}private String getResponseText(Response response) {String str = "Empty!";try {ResponseBody body = response.body();if (body != null && body.contentLength() != 0) {BufferedSource source = body.source();source.request(Long.MAX_VALUE);Buffer buffer = source.buffer();MediaType mediaType = body.contentType();if (mediaType != null) {@SuppressWarnings("CharsetObjectCanBeUsed") Charset charset = mediaType.charset(Charset.forName("UTF-8"));if (charset != null) {str = buffer.clone().readString(charset);}}}} catch (Exception e) {e.printStackTrace();}return str;}private String getRequestParams(Request request) {String str = "Empty!";try {RequestBody body = request.body();if (body != null) {Buffer buffer = new Buffer();body.writeTo(buffer);MediaType mediaType = body.contentType();if (mediaType != null) {@SuppressWarnings("CharsetObjectCanBeUsed") Charset charset = mediaType.charset(Charset.forName("UTF-8"));if (charset != null) {str = buffer.readString(charset);}}}} catch (Exception e) {e.printStackTrace();}return str;}private String getRequestHeaders(Request request) {Headers headers = request.headers();if (headers.size() > 0) {return headers.toString();} else {return "Empty!";}}
}

其中使用到的第三方SDK为:
日志打印:AndroidUtilCode
网络请求:OkHttp

打印效果:

Kotlin版本仅仅比Java版本多了两行时间的打印,从而可以计算当前请求的 大概 耗时,如果需要精确的耗时请使用 OkHttpClient.Builder().eventListener(eventListener: EventListener)

好用的自定义Okhttp日志拦截器相关推荐

  1. WebServices中使用cxf开发日志拦截器以及自定义拦截器

    首先下载一个cxf实例,里面包含cxf的jar包.我下的是apache-cxf-2.5.9 1.为什么要设置拦截器? 为了在webservice请求过程中,能动态操作请求和响应数据, CXF设计了拦截 ...

  2. Dubbo自定义日志拦截器

    前言 上一篇文章 Spring aop+自定义注解统一记录用户行为日志 记录了 web层中通过自定义注解配合Spring aop自动记录用户行为日志的过程.那么按照分布式架构中Dubbo服务层的调用过 ...

  3. 自定义日志_Dubbo自定义日志拦截器源码分析

    需求场景 在使用Dubbo搭建的分布式项目中,服务层代码调用是这样的: @GetMapping(value = "/info")2 public BaseResult userIn ...

  4. Dubbo自定义日志拦截器 1

    前言 上一篇文章 Spring aop+自定义注解统一记录用户行为日志 记录了 web层中通过自定义注解配合Spring aop自动记录用户行为日志的过程.那么按照分布式架构中Dubbo服务层的调用过 ...

  5. java创建请求拦截器_80.简单Retrofit+RxJava+日志拦截器结合使用

    1.需要使用到的依赖如下(Retrofit\RxJava\RecyclerView\日志拦截器) //only Retrofit(只用Retrofit联网) implementation 'io.re ...

  6. spring boot集成swagger,自定义注解,拦截器,xss过滤,异步调用,定时任务案例...

    本文介绍spring boot集成swagger,自定义注解,拦截器,xss过滤,异步调用,定时任务案例 集成swagger--对于做前后端分离的项目,后端只需要提供接口访问,swagger提供了接口 ...

  7. 自定义注解在拦截器中为空_如何在Android中为特定联系人设置自定义铃声

    自定义注解在拦截器中为空 Everyone likes to know who's calling before they actually pick up the phone, and the ea ...

  8. okhttp之拦截器

    okhttp的拦截器是项目中的精髓代码,今天我们来具体分析一下,base4.9.1版本,首先列一下okhttp的类图用来加深印象 我们已经知道拦截器是在RealCall中添加的: val interc ...

  9. 日志拦截器报错Cannot create a session after the response has been committed

    错误信息 日志拦截器AppLogInterceptor在方法处理完成之后,会对操作相关信息如参数.方法名.session信息等内容进行记录. 但是今天有同事开发时报错: Cannot create a ...

最新文章

  1. 吴恩达演讲直指AI落地三大挑战,并提出解决方案(附视频)
  2. Tesseract 3.02 OCR文字识别调查记录
  3. 深度学习的一些经验总结和建议| To do v.s Not To Do
  4. 计算未来轻沙龙 | AI=知识+推理,知识工程与数据管理专场来了!
  5. linux popd 命令,在Linux系统中的Pushd命令与Popd命令,教你这两个命令的基本用法...
  6. mysql 新建数据库
  7. mysql数据库mysqldump还原_mysqldump数据库备份与恢复
  8. Linux下查看出口IP
  9. 技术走向管理一些思考
  10. Replace Exception with Test(以测试取代异常)
  11. RadioButtonList控件绑定图片Vertical对齐
  12. 架构图解:支付宝钱包系统架构内部剖析
  13. 华为服务器扩容内存进不去系统,服务器换内存系统出问题吗
  14. 数据分析岗位求职经验分享
  15. 【读论文】基于深度学习的铁路道岔转辙机故障诊断(1绪)
  16. java 获取流 丢失_java文件流数据丢失问题
  17. 学习Java软件编程哪个机构好
  18. vue中el-table翻页序号连续
  19. OC中栈区与堆区的内存概念解析
  20. Linux入门学习(九)—— 怎么查看命令的帮助文档、怎么查看系统配置文件的帮助文档?

热门文章

  1. VS+QT 无法打开源文件解决方案
  2. 自制腾讯视频去除水印Chrome插件!厉害吧!
  3. 小学计算机反思案例,小学数学有效教学案例及反思
  4. 一文搞定敏捷项目管理精华,40张PPT直接拿去
  5. 网络教育计算机专业本科毕业自我评价,远程网络教育毕业生的自我评价
  6. 计算机网络中的CATV,有线电视网络(catv)中的多媒体通信_视频通信
  7. 8.linux 重定向详解,标准输入输出,输入重定向,输出重定向
  8. Python——定时器
  9. 《Python 深度学习》刷书笔记 Chapter 4 关于电影评论模型的进一步探讨
  10. 设计模式之桥梁模式和策略模式的区别