Ktor Server의 로깅
코드 예제: logging
Ktor는 사용하는 플랫폼에 따라 애플리케이션을 로깅하는 다양한 수단을 제공합니다.
- JVM에서 Ktor는 SLF4J API를 다양한 로깅 프레임워크(예: Logback 또는 Log4j)의 퍼사드(facade)로 사용하며 애플리케이션 이벤트를 로깅할 수 있게 해줍니다. 로깅을 활성화하려면 원하는 프레임워크에 대한 의존성을 추가하고 해당 프레임워크에 특화된 설정을 제공해야 합니다.
클라이언트 요청을 로깅하기 위해 CallLogging 플러그인을 설치하고 설정할 수도 있습니다.
- 네이티브 서버(Native server)의 경우, Ktor는 모든 내용을 표준 출력(standard output)으로 출력하는 로거를 제공합니다.
JVM
로거 의존성 추가
로깅을 활성화하려면 원하는 로깅 프레임워크의 아티팩트(artifact)를 포함해야 합니다. 예를 들어 Logback은 다음과 같은 의존성이 필요합니다.
Log4j를 사용하려면 org.apache.logging.log4j:log4j-core 및 org.apache.logging.log4j:log4j-slf4j-impl 아티팩트를 추가해야 합니다.
로거 설정
선택한 로깅 프레임워크를 설정하는 방법은 해당 문서를 참조하세요. 예:
예를 들어 Logback을 설정하려면 logback.xml 파일을 클래스패스(classpath)의 루트(예: src/main/resources)에 두어야 합니다. 아래 예제는 로그를 콘솔로 출력하는 STDOUT 어펜더(appender)를 사용하는 Logback 설정 샘플을 보여줍니다.
<configuration>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{YYYY-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<root level="trace">
<appender-ref ref="STDOUT"/>
</root>
<logger name="io.netty" level="INFO"/>
</configuration>로그를 파일로 출력하고 싶다면 FILE 어펜더를 사용할 수 있습니다.
<configuration>
<appender name="FILE" class="ch.qos.logback.core.FileAppender">
<file>testFile.log</file>
<append>true</append>
<encoder>
<pattern>%d{YYYY-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<root level="trace">
<appender-ref ref="FILE"/>
</root>
<logger name="io.netty" level="INFO"/>
</configuration>전체 예제는 여기에서 찾을 수 있습니다: logging.
네이티브
네이티브 서버의 로깅 레벨을 설정하려면, 애플리케이션을 실행할 때 KTOR_LOG_LEVEL 환경 변수에 다음 값 중 하나를 할당하세요.
- TRACE
- DEBUG
- INFO
- WARN
- ERROR
예를 들어, TRACE 레벨은 일부 경로가 왜 실행되지 않는지 판단하는 데 도움이 되는 경로 추적(route tracing)을 활성화합니다.
코드에서 로거에 접근하기
Logger 인스턴스는 Logger 인터페이스를 구현하는 클래스로 표현됩니다. Application.log 속성을 사용하여 Application 내부에서 Logger 인스턴스에 접근할 수 있습니다. 예를 들어, 아래 코드 스니펫은 모듈(module) 내부에서 로그에 메시지를 추가하는 방법을 보여줍니다.
import io.ktor.server.application.*
fun Application.module() {
log.info("Hello from module!")
}또한 call.application.environment.log 속성을 사용하여 ApplicationCall에서 로거에 접근할 수 있습니다.
routing {
get("/api/v1") {
call.application.environment.log.info("Hello from /api/v1!")
}
}플러그인 및 파일에서의 로깅
플러그인과 파일 내부에서 애플리케이션 로그를 사용하는 것은 권장되지 않습니다. 각 플러그인이나 파일에 대해 별도의 로거를 사용하는 것이 좋습니다. 이를 위해 모든 로깅 라이브러리를 사용할 수 있습니다.
멀티플랫폼 프로젝트의 경우 KtorSimpleLogger 클래스를 사용할 수 있습니다.
package com.example
import io.ktor.server.application.*
import io.ktor.server.request.*
import io.ktor.util.logging.*
internal val LOGGER = KtorSimpleLogger("com.example.RequestTracePlugin")
val RequestTracePlugin = createRouteScopedPlugin("RequestTracePlugin", { }) {
onCall { call ->
LOGGER.trace("Processing call: ${call.request.uri}")
}
}