如何为KTOR添加日志记录拦截器?

时间:2019-06-05 08:50:04

标签: logging kotlin ktor

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

 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
    }
}

2 个答案:

答案 0 :(得分:0)

您是否配置了日志记录? 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身体只能被食用一次,但是也许对此有所改变。

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

例如:

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

答案 1 :(得分:0)

由于您正在配置要跟踪的呼叫记录功能级别,因此您将需要配置您的记录系统(无论您使用的是哪种sl4j提供程序)以记录ktor.application进行跟踪。例如。用于log4j2.xml:

<Logger name="ktor.application" level="trace"/>