Kotlin에서 slf4j 로거 선언

less than 1 minute read

https://www.reddit.com/r/Kotlin/comments/8gbiul/slf4j_loggers_in_3_ways/ 자바에서 lombok을 쓰면서 고민도 하지 않았던 부분인데… 여기서는 왠지 신경쓰이는 부분.

class SimpleClass { private val log = LoggerFactory.getLogger(SimpleClass::class.java) }

이렇게 해야되는데.. 이렇게 매번쓰기 귀찮으니

CoreUtil.kotlin inline fun logger(): Logger { return LoggerFactory.getLogger(T::class.java) } inline fun logger2(): Logger { return LoggerFactory.getLogger(MethodHandles.lookup().lookupClass()) } 이걸 선언 해 두고 가져다 쓴다. 오브젝트에 선언하면 스태틱처럼 선언도 가능하지만 클래스 밖에 선언해두면 전역전역펑션으로 선언된다 인라인이 아니었다면… 클래스를 파라미터로 전달했겠지만 이렇게 해서 좀 더 간단해진다.

refied는 여기 참고. https://medium.com/@joongwon/kotlin-kotlin-%ED%82%A4%EC%9B%8C%EB%93%9C-%EB%B0%8F-%EC%97%B0%EC%82%B0%EC%9E%90-%ED%95%B4%EB%B6%80-part-3-59ff3ed736be

logger2는 댓글에 써 있는 방법.. 좀 더 간단해 보이는데 검증은 필요.

h2. 처리방법 1

companion object 길어서 좀 꼴뵈기 싫다 class MemberService { companion object { private val log = logger() } }

h2. 처리방법 2

위에다 선언… intellij에서 클래스 표시가 꺼진다. 왠지 기분나쁨 private val log = logger() class MemberService { }

h3. 처리방법 3

인터페이스, 앱스트랙트 사용

선언이 좀 성가셔 보이는데 코드가 제일 깔끔해보인다.

매번 호출하는건 아니겠지?

interface Logger { fun logger() = LoggerFactory.getLogger(this.javaClass) } class SimpleClass { companion object : Logger fun testfun(){ logger().info("aaa") } }

abstract class Logger { val logger: Logger = LoggerFactory.getLogger(this.javaClass) } class SimpleClass { companion object : Logger() fun testfun(){ logger.info("aaa") } }

Tags:

Categories:

Updated: