Что такое идиоматический способ Котлин, чтобы получить Логгера?

Я ищу заменить

private static final Logger log = Logger.getLogger(MyClass.class); 

с чем-то, что немного менее многословно и более идиоматично, тогда

 class MyClass { companion object { val log = LoggerFactory.getLogger(MyClass::class.java) } fun usage() { log.debug("Success") } } 

Бонусные баллы за то, что вам не нужно заниматься этим в каждом классе.

Я пытался:

 interface HasLogger { val log: Logger get() = LoggerFactory.getLogger(this.javaClass) } 

Но это приводит к вызову getLogger () для каждого использования (неприемлемо) также возвращает регистратор для подтипа (а не тот, где он был объявлен).

    Вы можете создать полезный метод, например

     inline fun <reified T:Any> loggerFor() = LoggerFactory.getLogger(T::class.java) 

    И просто используйте его как

     class MyClass { companion object { val log = loggerFor<MyClass>() } fun usage() { log.debug("Success") } } 

    В качестве альтернативы вы можете использовать частный регистратор уровня файлов, который экономит вас при наборе текста, что только кажется хорошим решением, если у вас нет нескольких классов со своими собственными логгерами, определенными для каждого файла:

     private val log = loggerFor<MyClass>() class MyClass { fun usage() { log.debug("Success") } } 

    Во-первых, вы можете добавить функции расширения для создания журнала.

     inline fun <reified T : Any> getLogger() = LoggerFactory.getLogger(T::class.java) fun <T : Any> T.getLogger() = LoggerFactory.getLogger(javaClass) 

    Затем вы сможете создать регистратор, используя следующий код.

     private val logger1 = getLogger<SomeClass>() private val logger2 = getLogger() 

    Во-вторых, вы можете определить интерфейс, который обеспечивает регистратор и его реализацию mixin.

     interface LoggerAware { val logger: Logger } class LoggerAwareMixin(containerClass: Class<*>) : LoggerAware { override val logger: Logger = LoggerFactory.getLogger(containerClass) } inline fun <reified T : Any> loggerAware() = LoggerAwareMixin(T::class.java) 

    Этот интерфейс можно использовать следующим образом.

     class SomeClass : LoggerAware by loggerAware<SomeClass>() { // Now you can use a logger here. }