在做 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:图中红色框中的按钮不要选中,不然会出现日志格式化失败。

更多相关文章

  1. Android 网络评分机制
  2. Android 项目实践(二)——网络连接
  3. Android 网络:Retrofit 与 Kotlin 协程
  4. Android P/9.0 http网络请求异常
  5. Eclipse用svn管理Android项目问题 (转来的)
  6. Android 网络安全配置
  7. Android零基础入门第15节:掌握Android Studio项目结构,扬帆起航
  8. Android应用项目绑定appcom_v7打包时,出现错误:"XXX"isnottransla

随机推荐

  1. Android判断应用程序从后台回到前台
  2. 传智播客Android视频教程——第三天
  3. android 设置EditText只可以输入字母或者
  4. 专利敲诈——微软对Android痛下杀手的背
  5. android图形验证码
  6. Android中的常见FC及解决方式整理
  7. Android最佳实践之:StrictMode介绍
  8. 【Android(安卓)Audio】Android(安卓)Aud
  9. Android(Java)正则表达式判断手机号、邮箱
  10. android断点续传实现方案之三