logging - 如何为 KTOR 添加日志拦截器?

当我使用 Retrofit 时,我可以轻松地创建日志记录拦截器以在 logcat 上查看带有正文和 header 的调用:

 val loggingInterceptor = HttpLoggingInterceptor().setLevel(HttpLoggingInterceptor.Level.BODY)
            val httpClient = OkHttpClient.Builder()
                    .addInterceptor(loggingInterceptor)

然后

 val retrofit = retrofit2.Retrofit.Builder()
                    .client(httpClient.build())

现在,we switched to Ktor我不知道 我不知道怎么办

  • 使用addInterceptor()
  • 对于 [install(CallLogging)][2] 没有任何反应..

有什么建议或例子吗?

[2] 来源:

fun Application.main() {
    install(CallLogging){
        level = Level.TRACE
    }
}

最佳答案

您是否配置了日志记录? Ktor 只提供了 slf4j api。 启动服务器时,您应该会看到:

SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.

这意味着,您需要在类路径中放置一个记录器实现。

最快的选择可能是implementation 'org.slf4j:slf4j-simple:1.7.26'

现在您应该从服务器获取一些日志。

但是,默认情况下,只会记录调用。

不记录标题和正文。

IIRC body 只能消耗一次,但也许有些事情改变了。

可以使用自定义拦截器记录 header 。

例如:

call.request.headers.entries()
    .map { it.key to it.value.joinToString(",") }
    .joinToString(";") { "${it.first}:${it.second}" }

https://stackoverflow.com/questions/56457143/

相关文章:

ios - 如何在我的 flutter 应用程序中添加连续移动的背景?

r - 如何更改 R 包的默认库路径

c# - 如何在另一个类中获取单例实例

spring-cloud - Spring Cloud Gateway 阻止路由发现请求

angular - 找不到 "src/assets"文件夹中的 JSON 文件

firebase - 如何通过 FlatList 将键传递到它的 renderItem 中?

sql-server - 连接到 SharePoint 服务器的 SQL 服务器

ionic-framework - ionic 应用程序上的 Youtube iframe 生成播放

android - Xamarin 安卓 : Cannot resolve GoogleSignIn

amazon-web-services - 对于不支持发件人 ID 的国家/地区,AWS SNS S