[토막글] Okhttp logger 제어하기

지프치프·2023년 9월 9일
0

Android

목록 보기
77/89

개요

지난번에 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!!
        }
    }
profile
지프처럼 거침없는 개발을 하고싶은 개발자

0개의 댓글