Kotlin 에서 로그는 어떻게 찍는게 좋을까?

dev_hwan·2024년 7월 21일

kotlin-logging 을 사용하여 람다로 로그를 찍는 것이 성능이 초큼 더 좋습니다.

코틀린으로 최근 프로젝트를 진행하면서 리뷰받은 내용을 정리 해보았습니다.

// 람다는 나중에 실행됨
// INFO 로그를 찍을 수 있는지 판단 -> 람다 함수 실행 -> 문자열을 생성
log.info { "코틀린이 미래다 -> ${variable}" }
// 문자열을 만든다. INFO 로그를 찍을 수 있는지 판단
log.info("코틀린이 미래다 -> $variable")
// INFO 로그를 찍을 수 있는지 판단 -> 문자열 생성(치환)
log.info("코틀린이 미래다 -> {}", variable)

기본 사용방법

gradle 의존성 추가

dependencies {
    implementation 'io.github.oshai:kotlin-logging-jvm:5.1.4'
}
fun main() {
    logger.trace { "This is trace log" }
    logger.debug { "This is debug log" }
    logger.info { "This is info log" }
    logger.warn { "This is warn log" }
    logger.error { "This is error log" }
}
  1. Kotlin Logging 을 사용하는 방법최상위 에 선언한다. (권장)
private val logger = KotlinLogging.logger {}
// 컴파일 후
// private val logger = LoggerFactory.getLogger("package.ClassName")

class UserService {
   // ...
}
  • 로그 레벨이 INFO일 때만 람다가 실행되어 문자열이 생성됩니다.
  • INFO 로그를 찍을 수 있는지 판단한 후에 람다를 실행하여 문자열을 생성합니다.
  • 즉, 불필요한 문자열 연산을 피할 수 있어 성능이 향상됩니다.
  • 이 방식은 단일 로거 인스턴스를 사용하는 것을 보장하며, 클래스 로딩 시 로거가 초기화됩니다.
  • 컴파일 시 val logger = LoggerFactory.getLogger("package.ClassName") 코드가 생성됩니다.
  1. 동반 객체를 만들고 KLogging 으로 확장하기 -> 덜추천
class UserService {
  companion object: KLogging()

  fun some() {
      logger.debug { "this is logger" }
  }
}
  • 문자열이 먼저 생성된 후 INFO 로그를 찍을 수 있는지 판단합니다.
  • 로그 레벨에 상관없이 항상 문자열 연산이 발생합니다.
  1. 인터페이스 상속 받아서 사용하기
class UserService: KLoggable { 
		override val logger: KLogger = logger() 
		fun some() { logger.debug { "this is logger" } }
}
  • INFO 로그를 찍을 수 있는지 판단한 후, 치환된 문자열을 생성합니다.
  • 일반 문자열보다는 효율적이지만 람다 표현식보다는 덜 효율적입니다.

Reference

https://www.baeldung.com/kotlin/kotlin-logging-library
https://github.com/oshai/kotlin-logging

profile
내맘대로 주제잡고 재미로 글쓰는 개발일지 블로그 👨‍💻

0개의 댓글