지난번에 okhttp logging 방법을 포스팅했었는데 오늘은 이를 활용하여 더 보기좋게 가공하는 방법을 포스팅해보고자 한다.
Okhttp client에 HttpLoggingInterceptor를 추가하여 요청과 응답에 대한 로그 출력을 하는 방법으로 지난 포스팅을 작성했었는데 이 방법이 단점은 log의 태그가 'okhttp'로 고정되어 출력된다는 점이다.
필터링을 하지 않고 로그를 분석하면 문제가 되지 않지만
앱에서 발생하는 로그 + 요청/응답 로그를 같이 확인하고 싶을 때는
태그가 달라져서 필터링이 힘들다.
물론 필터링 설정을 추가하여 태그는 앱에서 발생하는 로그, 메세지에 okhttp.. 이런식으로 필터링하면 보이기야 하겠지만 원하는 대로 필터링 되지 않을 일이 발생할 수 있을 뿐더러 뭔가 석연치 않은 느낌이다.
그래서 깔끔한 방법은 okhttp log도 앱 로그로 찍어주는 방법이다!
방법은 매우 간단하다.
HttpLoggingInterceptor의 logger를 재정의하여 message 출력을 앱 로그로 출력하는 방법이다.
아래의 코드를 살펴보자
private fun getLoggingInterceptor(level: HttpLoggingInterceptor.Level) : HttpLoggingInterceptor {
val logger = HttpLoggingInterceptor.Logger { message -> Log.d(message) }
return HttpLoggingInterceptor(logger).setLevel(level)
}
첫번째줄에서 logger를 재정의하여 message를 로그에 출력하도록 하고
두번째줄에서 재정의한 logger와 level을 셋팅한 interceptor를 반환한다.
아를 Client를 정의할 때 담아준 뒤 Retrofit에 설정해주면 된다!
private val httpClient = OkHttpClient.Builder().apply {
addNetworkInterceptor(getLoggingInterceptor(HttpLoggingInterceptor.Level.BODY))
addInterceptor { chain ->
val request = chain.request().newBuilder()
.addHeader(
"apiKey",
NetworkConstants.API_KEY
)
.build()
chain.proceed(request)
}
connectTimeout(60L, TimeUnit.SECONDS)
}
@Synchronized
fun getInstance() : Retrofit {
instance?.let {
return it
} ?: run {
instance = Retrofit.Builder().apply {
baseUrl(BASE_URL)
addConverterFactory(GsonConverterFactory.create())
client(httpClient.build())
}.build()
return instance!!
}
}