Ktor Clientでのロギング
必須の依存関係: io.ktor:ktor-client-logging
コード例: client-logging
ロギングとは、重要なイベント、エラー、または情報メッセージを記録することで、プログラムの動作を追跡し、問題を診断する方法です。
Ktorは、Loggingプラグインを使用してHTTPコールをログに記録する機能を提供します。 このプラグインは、異なるプラットフォーム向けに異なるロガータイプを提供します。
サーバー側では、Ktorはアプリケーションロギング用のLoggingプラグインと、クライアントリクエストのロギング用のCallLoggingプラグインを提供します。
JVM
JVMでは、Ktorはロギングの抽象化レイヤーとしてSimple Logging Facade for Java (SLF4J)を使用します。SLF4Jは、ロギングAPIと基盤となるロギング実装を分離し、 アプリケーションの要件に最適なロギングフレームワークを統合できるようにします。 一般的な選択肢にはLogbackや Log4jがあります。フレームワークが提供されていない場合、SLF4Jはデフォルトで no-operation (NOP)実装となり、実質的にロギングを無効にします。
ロギングを有効にするには、Logbackのような必要なSLF4J実装を含むアーティファクトを含めます。
Android
Androidでは、SLF4J Androidライブラリの使用を推奨します。
Native
Nativeターゲットの場合、Logging
プラグインはすべてを標準出力ストリーム (STDOUT
) に出力するロガーを提供します。
Multiplatform
マルチプラットフォームプロジェクトでは、Napierのようなカスタムロガーを指定できます。
依存関係の追加
Logging
プラグインを追加するには、以下のアーティファクトをビルドスクリプトに含めます。
Ktorクライアントに必要なアーティファクトの詳細については、
ロギングのインストール
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クラスによって提供されます。以下の例は、設定のサンプルを示しています。
logger
: Loggerインスタンスを指定します。Logger.DEFAULT
はSLF4Jロギングフレームワークを使用します。Nativeターゲットの場合、このプロパティを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
インスタンスを作成し、log
関数をオーバーライドする必要があります。 以下の例は、HTTPコールをログに記録するためにNapierライブラリを使用する方法を示しています。
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を参照してください。