【问题标题】:How to log requests in ktor http client?如何在 ktor http 客户端记录请求?
【发布时间】:2019-04-09 14:56:39
【问题描述】:

我得到了这样的东西:

private val client = HttpClient {
    install(JsonFeature) {
        serializer = GsonSerializer()
    }
    install(ExpectSuccess)
}

并提出类似的要求

  private fun HttpRequestBuilder.apiUrl(path: String, userId: String? = null) {
    header(HttpHeaders.CacheControl, "no-cache")
    url {
        takeFrom(endPoint)
        encodedPath = path
    }
}

但我需要检查请求和响应正文,有什么办法吗?在控制台/文件中?

【问题讨论】:

    标签: kotlin okhttp ktor


    【解决方案1】:

    我也遇到了这个问题。我改用Ktor OkHttp client,因为我熟悉那里的日志记录机制。

    更新您的 pom.xmlgradle.build 以包含该客户端(从 Ktor 站点复制/粘贴)并添加 OkHttp Logging Interceptor(同样,从该站点复制/粘贴)。当前版本是3.12.0

    现在配置客户端

    val client = HttpClient(OkHttp) {
        engine {
            val loggingInterceptor = HttpLoggingInterceptor()
            loggingInterceptor.level = Level.BODY
            addInterceptor(loggingInterceptor)
        }
    }
    

    【讨论】:

      【解决方案2】:

      您可以使用Logging 功能实现此目的。

      首先添加依赖:

      implementation "io.ktor:ktor-client-logging-native:$ktor_version"
      

      然后安装功能:

      private val client = HttpClient {
         install(Logging) {
            logger = Logger.DEFAULT
            level = LogLevel.ALL
         }
      }
      

      奖励:

      如果您需要在整个应用程序中拥有多个HttpClient 实例并且您希望重用一些配置,那么您可以创建一个扩展函数并在其中添加通用逻辑。例如:

      fun HttpClientConfig<*>.default() {
          install(Logging) {
              logger = Logger.DEFAULT
              level = LogLevel.ALL
          }
      
          // Add all the common configuration here.
      }
      

      然后像这样初始化你的HttpClient

      private val client = HttpClient {
         default()
      }
      

      【讨论】:

      • 我尝试添加这个,但我似乎看不到请求和响应日志:(
      • @ArchieG.Quiñones ktor 的错误处理能力很差。例如,如果您必须为请求的body 序列化一个类,并且您没有为该类提供(正确的)序列化程序,则不会发送请求并且您不会看到任何日志。也许您在 HttpClient 中配置了其他错误,但对我来说,序列化程序问题是看不到任何日志的最常见原因。
      • 我明白了。我没有使用任何序列化。所以不应该是这样。我正在尝试在 android 中执行此操作,而我即将进行日志记录的唯一方法是使用 OkHttp 作为 HttpClient 的引擎并在 OkHttp 中添加 LoggingInterceptor。我想知道是否只是添加日志记录本身就应该启用日志记录?
      • @ArchieG.Quiñones 您确定您的请求已正确发送吗?上面的例子适用于我在没有OkHttp 的 Android 上。如果您的 HttpClientConfig 块中抛出任何异常,则不会发送请求,您也不会看到任何日志。
      • 请求已发送,我收到回复。我只是没有看到日志。也许我做错了。你有一些我可以看的简单项目吗?我真的很感激。
      【解决方案3】:

      无论您使用哪个客户端或使用哪个框架,您都可以像这样实现自己的记录器:

      private val client = HttpClient {
          // Other configurations...
          install(Logging) {
              logger = CustomHttpLogger()
              level = LogLevel.BODY
          }
      }
      

      其中CustomHttpLogger 是实现ktor Logger 接口的任何类,如下所示:

      import io.ktor.client.features.logging.Logger
      
      class CustomHttpLogger(): Logger {
          override fun log(message: String) {
              Log.d("loggerTag", message) // Or whatever logging system you want here
          }
      }
      

      您可以在the documentation heresource code here 中阅读有关 Logger 接口的更多信息

      【讨论】:

      • 感谢提示,看起来默认记录器使用 slf4j,它在 Android 上没有任何作用。我已经报告了一个问题,让我们看看他们的反馈:youtrack.jetbrains.com/issue/KTOR-1219
      【解决方案4】:

      看起来我们应该处理HttpReceivePipeline 中的response。我们可以克隆原始响应并将其用于记录目的:

      scope.receivePipeline.intercept(HttpReceivePipeline.Before) { response ->
          val (loggingContent, responseContent) = response.content.split(scope)
      
          launch {
              val callForLog = DelegatedCall(loggingContent, context, scope, shouldClose = false)
              ....
          }
          ...
      }
      

      示例实现可以在这里找到:https://github.com/ktorio/ktor/blob/00369bf3e41e91d366279fce57b8f4c97f927fd4/ktor-client/ktor-client-core/src/io/ktor/client/features/observer/ResponseObserver.kt 并将在下一个次要版本中作为客户端功能提供。

      顺便说一句:我们可以为请求实现相同的方案。

      【讨论】:

        【解决方案5】:

        查看 Kotlin Logging,https://github.com/MicroUtils/kotlin-logging 它被许多开源框架使用并负责所有漂亮的打印。

        你可以像这样简单地使用它:

         private val logger = KotlinLogging.logger {  }
         logger.info { "MYLOGGER INFO" }
         logger.warn { "MYLOGGER WARNING" }
         logger.error { "MYLOGGER ERROR" }
        

        这将在控制台上打印消息。

        【讨论】:

        • 非常感谢,不知道,但你能帮我吗?在哪里添加这个来记录 ktor http 客户端请求/响应?安装自定义 KotlinLogging 功能?
        • 依赖于你使用的依赖管理器的类型,Gradle 或 Maven,你可以将依赖添加到 gradle.buildpom.xml for maven
        • 或者,如果您不使用其中任何一个,请从 github 发布页面下载 jar 文件。您可以记录任何您想要的内容,只需在文件顶部初始化一个私有 val 记录器,并将任何消息、变量或字符串模板放入记录器消息中。
        • @Seko 你介意将我的问题标记为答案吗?因此,我将获得积分并帮助 stackoverflow 社区。​​span>
        • 对不起,但这不是一个答案——它是某种存根。例如,在 okhttp 中,我们使用“设置”来记录请求级别,而我在 ktor 中需要类似的东西,但至少尝试使用 KotlinLogging 来存根它。等待答案
        猜你喜欢
        • 2020-02-25
        • 2015-12-05
        • 1970-01-01
        • 2012-09-15
        • 2022-12-26
        • 2021-06-23
        • 2021-11-15
        • 1970-01-01
        • 2023-03-09
        相关资源
        最近更新 更多