2016-06-11 3 views
8

우리가 코 틀린이를 사용하는코 틀린은 <pre><code>log.debug("random {}", { UUID.randomUUID() }) </code></pre> <p></p>이있는 인쇄됩니다 log4j2에서

// 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()); 

내 시도로 설명되어 편리한 기능이 매개 변수

random Function0<java.util.UUID> 

kotlin에 lambda 인수 로깅을 사용하려면 어떻게해야합니까? 아니면 우리가 명시 적으로 kotlin에게 어떤 메소드를 호출 할 것인가?

답변

8

debug()은 오버로드되어 있고 vararg Object를 인수로 취하는 다른 방법이 있습니다. Kotlin은 람다식이 Supplier가되어야한다는 것을 알지 못하기 때문에 Supplier<?>을 인수로 사용하는 것보다는 과부하를 선택합니다.

단지 공급 업체로 지정 :

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

나는 우리가

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

같은 것들을 쓸 수 있도록 ... 사용이 많은 재미를 만드는 클래스를 작성했습니다 당신은 심지어 해달라고

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

같은 게으른 람다 기록의 상당 이러한 {} paramet에 대한 필요 ... 여기

이 그것을 사용하고자하는 사람을위한 클래스입니다 ...

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() }) 
    } 
} 

또는 당신이 원하는 경우를 문자열을 erising, 그것은 대리자이기 때문에 당신은 모든 원본 로거 방법을 수행 할 수있는 로그에서 소스에 대한 멋진 참고 자료를 활용하십시오.

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() }) 
    } 
}