Создание регистратора на уровне пакета без класса

У меня есть файл kotlin с несколькими функциями уровня пакета и без какого-либо класса. Я хотел бы добавить запись в этот класс, но изо всех сил пытаюсь найти элегантный способ предоставить логгеру идентификатор.

Это пример

package com.example.myproject.my_package import org.slf4j.LoggerFactory private val log = LoggerFactory.getLogger("com.example.myproject.my_package") fun bla(term: String) { log.info("invoked with $term") } 

Есть очень хорошие рекомендации по использованию классов для поиска хорошего идентификатора: link 1 link 2 . Какой ваш любимый подход, если нет классов?

Я хотел бы избежать записи идентификатора вручную и настроить его при изменении имени пакета. Есть ли способ получить имя пакета в kotlin?

Эта строка должна выполнять эту работу:

 private val log = LoggerFactory.getLogger(object{}::class.java.`package`.name) 

Объект ничего не делает, но тем не менее kotlin создаст класс для хранения кода. Затем вы можете получить доступ к классу, пакету, имени пакета.

Обратите внимание на использование backtick, потому что package является зарезервированным ключевым словом. В java это не проблема, потому что реальный метод – getPackage() . Более короткий синтаксис kotlin трансформирует этот вызов метода прямым доступом к свойству, имя которого теперь сталкивается с зарезервированными ключевыми словами.

Вы можете создать регистратор верхнего уровня для сгенерированного класса следующим образом:

 private val logger = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass()) 

Или для пакета следующим образом:

 private val logger = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass().`package`.name) 

Это имеет смысл не создавать дополнительный файл класса, а требует по крайней мере Java 7. Я создал библиотеку, которая помогает с этим и более на https://github.com/kxtra/kxtra-slf4j .