KotlinLogging 라이브러리 활용하기

Noul·2025년 5월 10일

개요

애플리케이션에 적절한 로깅이나 출력 로직이 없으면 디버깅이나 장애 발생 시,
로직의 흐름이나 예외 원인 등을 추적하기 어렵다.

코드가 어떻게 동작하는지, 서비스에서 문제가 발생했을 때 원인이 무엇인지 빠르게 파악하기 위해서 로깅은 필수이다.

특히 운영 환경에서는 디버깅이 쉽지 않기 때문에 그 중요성은 더 크다고 생각한다.

따라서 지금 진행중인 개인 프로젝트에 KotlinLogging이라는 라이브러리를 활용하여 로깅을 도입하기로 했다.



KotlinLogging

KotlinLoggingKotlin 전용 로깅 라이브러리로, 내부적으로는 SLF4J를 기반으로 동작한다.
위 라이브러리를 선택한 이유는 다음과 같다.

  • 문법이 간결하고 Kotlin 스타일에 잘 어울림
    • 로거 선언이 간단하고 코틀린의 람다 표현식으로 가독성이 좋다.
  • 람다 내부가 필요할 때만 실행되므로 성능 상 이점이 있다.
    • 로그 메시지를 람다로 감싸기 때문에 해당 로그 레벨이 활성화되어 있지 않으면 람다 내부의 문자열 연산 자체가 실행되지 않는다.
    • 예를 들어, 로깅 레벨이 INFO로 설정되어 있으면 TRACE, DEBUG 레벨의 람다는 호출되지 않는다.
  • SLF4J 기반이라 확장성과 호환성이 뛰어나다.
    • 덕분에 Logback, Log4j2 등 다른 로깅 프레임워크와 쉽게 연동할 수 있다.


적용

의존성 추가

Maven

<dependency>
  <groupId>io.github.oshai</groupId>
  <artifactId>kotlin-logging-jvm</artifactId>
  <version>7.0.3</version>
</dependency>

Gradle

implementation("io.github.oshai:kotlin-logging-jvm:7.0.3")

얘네는 Spring Boot의 의존성 관리가 자동으로 버전을 지정해주지 않기 떄문에 버전 정보를 명시해줘야 한다.

버전 정보는 KotlinLogging GitHub 에서 확인할 수 있다.

Logger 선언

코틀린 파일 최상단에 다음과 같이 선언한다.

private val logger = KotlinLogging.logger {}

로그 출력 예시

fun example() {
	val hello = "Hello World!"
    logger.info { hello }

    val level = "debug"
    logger.debug { "$level logging" }

    try {
        throw IllegalArgumentException("예외 발생")
    } catch (e: Exception) {
        logger.error(e) { "An error occurred: ${e.message}" }
    }
}
  • error(e) 형태는 예외 스택트레이스를 로그 메시지 뒤에 함께 출력해준다.


참고

KotlinLogging GitHub
관련 카카오페이 기술블로그

profile
고민하고 트레이드오프

0개의 댓글