Ktor 客户端中的日志记录
所需依赖项: io.ktor:ktor-client-logging
代码示例: client-logging
日志记录是一种通过记录重要事件、错误或信息性消息来跟踪程序运行状况和诊断问题的方式。
Ktor 提供了使用 Logging 插件记录 HTTP 调用的能力。 此插件为不同的平台提供了不同的 Logger 类型。
在服务器端,Ktor 提供了用于应用程序日志记录的 Logging 插件和用于记录客户端请求的 CallLogging 插件。
JVM
在 JVM 上,Ktor 使用用于 Java 的简单日志门面 (SLF4J) 作为日志记录的抽象层。SLF4J 将日志记录 API 与底层日志记录实现解耦, 使你能够集成最符合你的应用程序需求的日志框架。 常见的选择包括 Logback 或 Log4j。如果没有提供任何框架,SLF4J 将默认为无操作 (NOP) 实现,这会实质上禁用 日志记录。
要启用日志记录,请包含一个包含所需 SLF4J 实现的构件,例如 Logback:
Android
在 Android 上,我们建议使用 SLF4J Android 库:
Native
对于 原生目标平台,Logging 插件提供了一个 Logger,它将所有内容打印到标准输出流 (STDOUT)。
Multiplatform
在 多平台项目 中,你可以指定一个 自定义 Logger,例如 Napier。
添加依赖项
要添加 Logging 插件,请在你的构建脚本中包含以下构件:
你可以通过
安装 Logging
要安装 Logging,请在 客户端配置块 内将其传递给 install 函数:
import io.ktor.client.*
import io.ktor.client.engine.cio.*
import io.ktor.client.plugins.logging.*
//...
val client = HttpClient(CIO) {
install(Logging)
}配置 Logging
Logging.Config 类提供了 Logging 插件的配置。以下示例展示了一个配置示例:
logger : 指定一个 Logger 实例。Logger.DEFAULT 使用 SLF4J 日志框架。对于原生目标平台,将此属性设置为 Logger.SIMPLE。
level : 指定日志记录级别。LogLevel.HEADERS 将只记录请求/响应头部。
filter() : 允许你过滤与指定谓词匹配的请求的日志消息。在以下示例中,只有对 ktor.io 发出的请求才会记录到日志中。
sanitizeHeader() : 允许你净化敏感头部,以避免其值出现在日志中。在以下示例中,Authorization 头部的值在记录时将被替换为 '***'。
package com.example
import io.ktor.client.*
import io.ktor.client.engine.cio.*
import io.ktor.client.plugins.logging.*
import io.ktor.client.request.*
import io.ktor.client.statement.*
import io.ktor.http.*
import kotlinx.coroutines.runBlocking
fun main() {
runBlocking {
val client = HttpClient(CIO) {
install(Logging) {
logger = Logger.DEFAULT
level = LogLevel.HEADERS
filter { request ->
request.url.host.contains("ktor.io")
}
sanitizeHeader { header -> header == HttpHeaders.Authorization }
}
}
val response1: HttpResponse = client.get("https://ktor.io/")
val response2: HttpResponse = client.get("https://jetbrains.com/")
}
}有关完整示例,请参见 client-logging。
提供自定义 Logger
要在客户端应用程序中使用自定义 Logger,你需要创建一个 Logger 实例并覆盖 log 函数。 以下示例展示了如何使用 Napier 库记录 HTTP 调用:
package com.example
import io.github.aakira.napier.DebugAntilog
import io.github.aakira.napier.Napier
import io.ktor.client.*
import io.ktor.client.engine.cio.*
import io.ktor.client.plugins.logging.*
import io.ktor.client.request.*
import io.ktor.client.statement.*
import kotlinx.coroutines.runBlocking
fun main() {
runBlocking {
val client = HttpClient(CIO) {
install(Logging) {
logger = object: Logger {
override fun log(message: String) {
Napier.v("HTTP Client", null, message)
}
}
level = LogLevel.HEADERS
}
}.also { Napier.base(DebugAntilog()) }
val response: HttpResponse = client.get("https://ktor.io/")
}
}有关完整示例,请参见 client-logging-napier。
