Ktor 클라이언트의 로깅
필수 의존성: io.ktor:ktor-client-logging
코드 예시: client-logging
로깅은 프로그램이 무엇을 하는지 추적하고 중요한 이벤트, 오류 또는 정보 메시지를 기록하여 문제를 진단하는 방법입니다.
Ktor는 로깅(Logging) 플러그인을 사용하여 HTTP 호출을 로깅하는 기능을 제공합니다. 이 플러그인은 다양한 플랫폼에 맞는 여러 로거 유형을 제공합니다.
서버에서 Ktor는 애플리케이션 로깅을 위한 로깅(Logging) 플러그인과 클라이언트 요청 로깅을 위한 CallLogging 플러그인을 제공합니다.
JVM
JVM에서 Ktor는 로깅을 위한 추상화 계층으로 SLF4J(Simple Logging Facade for Java)를 사용합니다. SLF4J는 로깅 API를 기본 로깅 구현으로부터 분리하여, 애플리케이션 요구 사항에 가장 적합한 로깅 프레임워크를 통합할 수 있도록 합니다. 일반적인 선택으로는 Logback 또는 Log4j가 있습니다. 프레임워크가 제공되지 않으면 SLF4J는 기본적으로 로깅을 비활성화하는 NOP(No-Operation) 구현으로 설정됩니다.
로깅을 활성화하려면 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.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
함수를 오버라이드해야 합니다. 아래 예시는 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를 참조하세요.