Skip to content

Instantly share code, notes, and snippets.

@djkeh
Last active October 20, 2023 02:48
Show Gist options
  • Save djkeh/713f7468171ef0a690b504946ebcebb8 to your computer and use it in GitHub Desktop.
Save djkeh/713f7468171ef0a690b504946ebcebb8 to your computer and use it in GitHub Desktop.
kotlin-logging 사용법: logger 스타일 가이드

개요: kotling-logging 사용법

kotlin-logging에서 logger를 선언하는 방법은 2가지로 정리할 수 있다.

1. 표준안, 정석: static logger outside class

import io.github.oshai.kotlinlogging.KotlinLogging

private val logger = KotlinLogging.logger {} // 로거를 클래스 밖에 두는 방법

class FooWithLogging {

    val message = "world"

    fun bar() {
        logger.debug { "hello $message" }
    }
}

2. Controversial(논의 여지 있음): Instance logger inside class

이렇게 써도 문제가 되지는 않는다는 공식 답변1을 얻은 상태.

import io.github.oshai.kotlinlogging.KotlinLogging

class FooWithLogging {

    private val logger = KotlinLogging.logger {} // 로거를 클래스 안에 두는 방법
    val message = "world"

    fun bar() {
        logger.debug { "hello $message" }
    }
}

결론 - 사용 방법은 2안을 진지하게 검토할 수 있으나, 현재는 일단 1안을 권고한다.

kotlin-logging으로 logger를 얻어내는 방법은 몇 가지가2 있으나, 1안을 공식 표준 스타일로 채택하고 1안을 권고한다.

  • 1안은 static logger를 만들어 클래스마다 하나의 logger instance 를 만들려는 목적이 있음
  • 속도와 메모리에서 효율적인 방법
  • static logger를 만드는 방법들2 중에 가장 간편한 방법
  • 자바 static logger style을 따르는 방법

생각해볼 지점

아래 2안의 합리적인 장점을 모두 고려한 상태에서, 표준 스타일은 일단 1안으로 결정한다.

  • 아파치 log4j 공식 홈페이지는 코틀린 가이드에서 static logger를 권고한다.
  • slf4j 공식 홈페이지 faq는 instance logger vs. static logger 에서 특정 스타일을 권고하지 않기로 결정한다.
    • 이유는 각 방법이 상호 대체 불가능한 장단점을 가지기 때문
    • 그러나 instance logger 가 ioc container 환경의 프로젝트에 좀 더 적합하다는 의견
  • 스프링 프레임워크를 사용하는 환경에서는 2안을 더 합리적인 선택으로 볼 수도 있다.
    • logger를 사용하는 각 서비스 클래스는 싱글턴이므로 1번만 생성됨 -> instance logger도 1회 생성됨
    • kotlin logger 자체가 object임 -> kotlin 에 의해 싱글턴으로 1회 생성됨
    • logger instance 를 허용하면, 좀 더 코드 스타일을 바꿔서 의존성으로 처리 및 테스트가 가능
    • 코드 편집 시 ide 의 지원을 받기 좀 더 용이한 스타일

Reference

Footnotes

  1. https://github.com/oshai/kotlin-logging/issues/364#issuecomment-1767948237

  2. https://github.com/oshai/kotlin-logging/wiki#obtaining-a-logger 2

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment