2016-06-11 18 views
8

W log4j2 mamy poręczną funkcję, która jest opisana jakoKotlin zalogowaniu z lambda Parametry

// Java-8 style optimization: no need to explicitly check the log level: 
// the lambda expression is not evaluated if the TRACE level is not enabled 
logger.trace("Some long-running operation returned {}",() -> expensiveOperation()); 

mojej próbie użycia tego w Kotlin

log.debug("random {}", { UUID.randomUUID() }) 

który wypisze

random Function0<java.util.UUID> 

Jak korzystać z rejestrowania argumentów lambda za pomocą kotlin? Lub w jaki sposób możemy wyraźnie powiedzieć kotlin jakiej metody wywołać?

Odpowiedz

8

Problem polega na tym, że debug() jest przeciążone, a inna metoda przyjmuje argument Objectarg jako vararg. Kotlin wybiera to przeciążenie zamiast argumentu, który przyjmuje argument Supplier<?>, ponieważ nie wie, że wyrażenie lambda ma być Dostawcą.

Wystarczy określić go jako dostawcy:

log.debug("random {}", Supplier { UUID.randomUUID() }) 
1

ja napisałem klasę, która sprawia, że ​​to dużo zabawy w obsłudze ... Tak, że możemy napisać rzeczy jak

log.debug { "some $thing is $that" } 

który jest odpowiednik leniwe rejestrowania lambda jak

log.debug("some {} is {}",()->thing,()->that) 

Ty nawet nie trzeba ich {} dla PARAMET erising ciąg, a masz wszystkie oryginalne metody rejestratora jak to jest delegatem ...

tutaj jest klasą dla każdego, kto chciałby go używać ...

import org.apache.logging.log4j.util.Supplier 

class Logger(private val logger: org.apache.logging.log4j.Logger) : org.apache.logging.log4j.Logger by logger { 

    fun info(supplier:() -> String) { 
     logger.info(Supplier { supplier.invoke() }) 
    } 

    fun debug(supplier:() -> String) { 
     logger.debug(Supplier { supplier.invoke() }) 
    } 

    fun warn(supplier:() -> String) { 
     logger.warn(Supplier { supplier.invoke() }) 
    } 

    fun error(supplier:() -> String) { 
     logger.error(Supplier { supplier.invoke() }) 
    } 

    fun trace(supplier:() -> String) { 
     logger.trace(Supplier { supplier.invoke() }) 
    } 
} 

lub jeśli chcesz aby skorzystać z niesamowitych odniesień do źródła w dziennikach, które można wykonać:

import org.apache.logging.log4j.util.Supplier 

class Logger(val logger: org.apache.logging.log4j.Logger) : org.apache.logging.log4j.Logger by logger { 

    inline fun info(crossinline supplier:() -> String) { 
     logger.info(Supplier { supplier.invoke() }) 
    } 

    inline fun debug(crossinline supplier:() -> String) { 
     logger.debug(Supplier { supplier.invoke() }) 
    } 

    inline fun warn(crossinline supplier:() -> String) { 
     logger.warn(Supplier { supplier.invoke() }) 
    } 

    inline fun error(crossinline supplier:() -> String) { 
     logger.error(Supplier { supplier.invoke() }) 
    } 

    inline fun trace(crossinline supplier:() -> String) { 
     logger.trace(Supplier { supplier.invoke() }) 
    } 
} 
Powiązane problemy