OkHttpでバイナリログを出さなくするInterceptor

Androidアプリ開発の通信ログの話。
okhttpで「開発版の場合ではログを全出し(HttpLoggingInterceptor.Level.BODY)」という設定をよくやるけど、この時困るのが画像アップロード時などに大量のバイナリログが出てしまうこと。
ログが追いづらくなるばかりか、容量過多か何かでlogcatプロセスが落ちてしまう場合すらある。

この場合、Interceptorでmultipart通信時のみログレベルを HEADERS 以下に落としてやれば良さそう
実装としては以下のような感じ

    fun getClient(): OkHttpClient {
        val httpLoggingInterceptor =
            HttpLoggingInterceptor().setLevel(HttpLoggingInterceptor.Level.BODY)

        return OkHttpClient.Builder()
            .addInterceptor(MultipartLoggingInterceptor(httpLoggingInterceptor))
            .addInterceptor(httpLoggingInterceptor)
            .build()
    }

    class MultipartLoggingInterceptor constructor(
        private val loggingInterceptor: HttpLoggingInterceptor
    ) : Interceptor {
        override fun intercept(chain: Interceptor.Chain): Response {
            val isMultipart = chain.request().body is MultipartBody
            if (isMultipart) {
                loggingInterceptor.level = HttpLoggingInterceptor.Level.HEADERS
            }
            val request = chain.request().newBuilder().build()
            return chain.proceed(request)
        }
    }

参考

I have successfully implemented a network request that uploads a multipart/form-data file. Presumably due to the logging level we have set on the OkHttp client,...

-> このmultipart判定はうまく動かなかった

スポンサーリンク
レクタングル(大)
レクタングル(大)