在做 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 输出日志只需要简单几步即可
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()
}
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)
}
}