在 Kotlin 中使用 Logger 打印 OkHttp 网络请求返回的 Logcat 日志
16lz
2021-01-23
在做 Android
开发的时候,好的日志输出,能够快速定位问题所在。之前在使用 Java
开发 Android
的时候,我使用的是这个库: orhanobut/logger
现在使用 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 输出日志只需要简单几步即可
- 在 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() }
- 在自定义的类中将日志打印出来 (相关工具类可在 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) }}
PS:图中红色框中的按钮不要选中,不然会出现日志格式化失败。
更多相关文章
- Android 网络评分机制
- Android 项目实践(二)——网络连接
- Android 网络:Retrofit 与 Kotlin 协程
- Android P/9.0 http网络请求异常
- Eclipse用svn管理Android项目问题 (转来的)
- Android 网络安全配置
- Android零基础入门第15节:掌握Android Studio项目结构,扬帆起航
- Android应用项目绑定appcom_v7打包时,出现错误:"XXX"isnottransla