Intereting Posts
Как получить вход от пользователя в Android Studio в числовом значении и преобразовать его в переменную int в kotlin? Значение ObservableField не распространяется Использование Mockito, Как мне отобразить класс Kotlin с декларацией поля интерфейса val? Kotlin: проверьте, был ли инициализирован ленивый val Ошибка: выполнение выполнено для задачи ': app: javaPreCompileDebug'. > java.io.IOException: не удалось удалить annotationProcessors.json Плагин Kotlin выйдет из строя Android Studio Проблемы с переходом от фрагментатора / MapFragment к supportfragmentManager / SupportMapFragment Тип универсального парного типа для дополнительных целей Kotlin и RxJava2 zip operator – Ни одна из следующих функций не может быть вызвана с предоставленными аргументами Как импортировать пакеты Java в Kotlin Native recyclerview onClick getkey из firebase Ошибка подключаемого модуля: Kotlin бросил непроверенное исключение IllegalStateException Изменить порядок слов в строке в Котлине Котлин и Грейдл без Maven Central? Предполагаемый тип – Фрагмент! но ожидалось PlaceAutocompleteFragment

Функция логарифма расширения Kotlin с logback (slf4j)

Я создал функцию расширения для ведения журнала:

import org.slf4j.LoggerFactory fun Any.log(msg: String) { LoggerFactory.getLogger(javaClass.name).debug(msg) } 

Но я не уверен, что это будет init в любое время, когда он будет вызван или нет, потому что метод LoggerFactory.getLogger вызывает getILoggerFactory .

Мб кто-то уже сделал что-то подобное и может заверить меня, что это не будет утечкой памяти :)?

На данный момент я использую подход старой моды (объявления поля журнала в классе):

 companion object { private val logger = LoggerFactory.getLogger(LoggerTest::class.java.name) } 

но простой unit тест:

 @Test fun testLogger() { val start = System.currentTimeMillis() for (i in 0..999) { log("i=" + i) } val end = System.currentTimeMillis() val time = end - start println("*** TIME=" + time.toDouble() / 1000 + " sec") } 

показывает тот же результат, что и с опцией старой моды:

 @Test fun testLogger() { val start = System.currentTimeMillis() for (i in 0..999) { logger.debug("i=" + i) } val end = System.currentTimeMillis() val time = end - start println("*** TIME=" + time.toDouble() / 1000 + " sec") } companion object { private val logger = LoggerFactory.getLogger(LoggerTest::class.java.name) } 

~ *** TIME=0.02 sec

Я использую:

 org.slf4j - 1.7.25 ch.qos.logback - 1.2.3 

    Для ведения журнала я мог бы порекомендовать другое решение.

    Во-первых, добавьте интерфейс ILogging и класс LoggingImpl:

     interface ILogging { val log: Logger } class LoggingImp(loggerImpl: Logger) : ILogging { override val log: Logger = loggerImpl companion object { operator inline fun <reified T> invoke(): LoggingImp { return LoggingImp(LoggerFactory.getLogger(T::class.java)) } } } 

    И теперь вы можете добавить регистратора в любой класс, используя делегацию Kotlin:

     class TestClass : ILogging by LoggingImp<TestClass>() { fun test() { log.info("test") } } 

    Logger будет создан при создании родительского объекта. Пример использования:

     fun main(args: Array<String>) { val testClass = TestClass() testClass.test() } 

    Надеюсь, что это поможет вам.

    Еще более простое решение использует интерфейс со стандартным методом.

     interface ILogger { @get:JsonIgnore val logger: Logger get() = LoggerFactory.getLogger(this) } 

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

     class TestClass : ILogging { fun test() { logger.info("test") } }