kotlin-logging
에서 logger
를 선언하는 방법은 2가지로 정리할 수 있다.
import io.github.oshai.kotlinlogging.KotlinLogging
private val logger = KotlinLogging.logger {} // 로거를 클래스 밖에 두는 방법
class FooWithLogging {
val message = "world"
fun bar() {
logger.debug { "hello $message" }
}
}
이렇게 써도 문제가 되지는 않는다는 공식 답변1을 얻은 상태.
import io.github.oshai.kotlinlogging.KotlinLogging
class FooWithLogging {
private val logger = KotlinLogging.logger {} // 로거를 클래스 안에 두는 방법
val message = "world"
fun bar() {
logger.debug { "hello $message" }
}
}
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 의 지원을 받기 좀 더 용이한 스타일
- kotlin-logging 공식 홈페이지: https://github.com/oshai/kotlin-logging/
- 문의 내용: oshai/kotlin-logging#364
- slf4j 공식 faq: https://slf4j.org/faq.html#declared_static
- apache log4j kotlin guide: https://logging.apache.org/log4j/kotlin/latest/#usage
- 국내 관련 블로그: https://kjkjjang.wordpress.com/2019/05/06/spring-환경에서-log는-static-instance-variables/
- stackoverflow: https://stackoverflow.com/questions/8262310/any-reason-to-use-private-instead-of-private-final-static-on-the-logback-logger