在 Kotlin 中使用 Logger 打印 OkHttp 网络请求返回的 Logcat 日志

在做 Android 开发的时候,好的日志输出,能够快速定位问题所在。之前在使用 Java 开发 Android 的时候,我使用的是这个库: orhanobut/logger
在 Kotlin 中使用 Logger 打印 OkHttp 网络请求返回的 Logcat 日志_第1张图片
现在使用 Kotlin 开发 Android ,还想继续使用这个库,而开发阶段常见的日志输出是 将接口返回的结果打印出来,下面就介绍如何在 Kotlin 项目中接入 logger库。

集成

module下的 build.gradle中添加

implementation 'com.orhanobut:logger:2.2.0'

接着在 application 中初始化

Logger.addLogAdapter(AndroidLogAdapter())

application中还可以对logger进行一些高级的配置

val formatStrategy = PrettyFormatStrategy.newBuilder()
   .showThreadInfo(false)  // 输出线程信息. 默认输出
   .methodCount(0)         // 方法栈打印的个数,默认是2
   .methodOffset(7)        // 设置调用堆栈的函数偏移值,0的话则从打印该Log的函数开始输出堆栈信息,默认是0
   .logStrategy(LogCatStrategy())
   .build()
Logger.addLogAdapter(AndroidLogAdapter(formatStrategy))

LogCatStrategy 策略是解决 AndroidStudio logcat 日志换行问题

class LogCatStrategy: LogStrategy {
    override fun log(priority: Int, tag: String?, message: String) {
        Log.println(priority, randomKey() + tag!!, message)
    }

    private var last: Int = 0

    private fun randomKey(): String {
        var random = (10 * Math.random()).toInt()
        if (random == last) {
            random = (random + 1) % 10
        }
        last = random
        return random.toString()
    }
}

基本使用

Logger.d("debug");
Logger.e("error");
Logger.w("warning");
Logger.v("verbose");
Logger.i("information");
Logger.wtf("What a Terrible Failure");

查看项目主页 orhanobut/logger README有详细介绍。

输出网络日志

前提是 OkHttp 网络请求库已经集成。可以参考我的组件化框架项目:FrameDemo 里面的网络请求集成。

网络请求使用的是 OkHttp

com.squareup.okhttp3:okhttp:4.0.0

日志拦截使用的是logging-interceptor

com.squareup.okhttp3:logging-interceptor:4.0.0

在 OkHttp 中使用 logger 输出日志只需要简单几步即可

  1. 在 OkHttp 中添加拦截器(重点看中文注释部分即可)
private fun getOkHttpClient(): OkHttpClient {
        val cacheFile = File(BaseApplication.context.cacheDir, "cache")
        val cache = Cache(cacheFile, 1024 * 1024 * 50) 
        // 创建日志拦截器 HttpLogger() 是自定义的类
        val logInterceptor = HttpLoggingInterceptor(HttpLogger())
        logInterceptor.level = HttpLoggingInterceptor.Level.BODY
        
        return OkHttpClient.Builder()
            .cache(cache) 
            .connectTimeout(60L, TimeUnit.SECONDS)
            .readTimeout(60L, TimeUnit.SECONDS)
            .writeTimeout(60L, TimeUnit.SECONDS)
            .cookieJar(PersistentCookieJar(SetCookieCache(), SharedPrefsCookiePersistor(BaseApplication.context)))
            .addInterceptor(ChangeBaseUrlInterceptor())
            .addInterceptor(CacheInterceptor())
            // 添加日志拦截拦截器
            .addNetworkInterceptor(logInterceptor)
            .addInterceptor(CheckLoginInterceptor())
            .build()
    }
  1. 在自定义的类中将日志打印出来 (相关工具类可在 FrameDemo 项目的lib_common 模块下的 utils包下找到)
class HttpLogger: HttpLoggingInterceptor.Logger {
    override fun log(message: String) {
        var msg = message

        // 以{}或者[]形式的说明是响应结果的json数据,需要进行格式化
        if ((msg.startsWith("{") && msg.endsWith("}"))
            || (msg.startsWith("[") && msg.endsWith("]"))) {
            msg = JsonUtils.formatJson(JsonUtils.decodeUnicode(msg))
        }
        LogUtils.d(msg)
    }
}

在 Kotlin 中使用 Logger 打印 OkHttp 网络请求返回的 Logcat 日志_第2张图片
PS:图中红色框中的按钮不要选中,不然会出现日志格式化失败。

你可能感兴趣的:(Kotlin,Android,Android,学习笔记)