Log4j2 lazy lambda评估:Groovy中有机会吗?

Log4j2 lazy lambda评估:Groovy中有机会吗?,groovy,lambda,log4j2,Groovy,Lambda,Log4j2,问题似乎在于Log4j2的纯Java实现并没有提供闭包参数(或者lambda参数,如果有的话),而是在方法签名中提供了一个简单的对象参数。Groovy(3.0.8)将Java风格的lambda和方法引用转换为闭包,而Log4j似乎只是对它们调用了.toString()。因此,下面代码的日志输出如下所示,这显然不是来自Java的预期结果: 13:55:39.417 [main] INFO Messenger - test$_runCode_closure1@f391e52 13:55:39.41

问题似乎在于Log4j2的纯Java实现并没有提供闭包参数(或者lambda参数,如果有的话),而是在方法签名中提供了一个简单的对象参数。Groovy(3.0.8)将Java风格的lambda和方法引用转换为闭包,而Log4j似乎只是对它们调用了.toString()。因此,下面代码的日志输出如下所示,这显然不是来自Java的预期结果:

13:55:39.417 [main] INFO  Messenger - test$_runCode_closure1@f391e52
13:55:39.417 [main] INFO  Messenger - test$_runCode_closure2@4b518645
13:55:39.417 [main] INFO  Messenger - org.codehaus.groovy.runtime.MethodClosure@294a3f2a

在Groovy中,有没有办法在这里使用Java lambda而不是Groovy闭包?Groovy扩展为Logger方法提供方法签名和闭包,这可能是一个答案吗?

免责声明:这不是一个正确的答案,而是一个解决方法

Groovys GString还可以处理闭包,每次调用闭包时都会调用闭包 GString必须显示为字符串

例如

因此,您可以使用:

log2.info ("${ -> "Expensive message" }")
作为记录:所有人都给了我
对象
,而不是
供应商
翻来覆去的版本:

log2.info('{}', {42} as Supplier)
log2.info('{}', [{42}].toArray())
log2.info('{}', [{42}] as Supplier[])
log2.info('{}', [{42}] as Supplier<Long>[])
log2.info('{}', new Supplier() { Object get() { 42 } })
log2.info('{}', *[{42}])
log2.info({},{42}作为供应商)
log2.info('{}',[{42}].toArray()
log2.info('{}',[{42}]作为供应商[])
log2.info('{}',[{42}]作为供应商[])
log2.info('{}',new Supplier(){Object get(){42}})
log2.info('{}',*[{42}])

两者都不能使用
@CompileStatic
(最后一个除外,它根本不编译)。使用Groovy 4.0.0-alpha3进行测试

没有答案,但可能可用作解决方法:
log2.info(“${->”昂贵消息“}”)
应该做你想做的事情want@cfrick如果你把这个作为答案,我会投赞成票。没有什么能比得上一个好的变通方法,特别是当它指向以Groovy风格做事时。谢谢。info方法有哪些可用的签名?如果您使用的是lambda或方法引用,并且它与函数接口参数匹配,那么它应该是静态编译下的本机lambda。然而,它听起来像一个物体或物体。。。方法是匹配的方法。
log2.info ("${ -> "Expensive message" }")
log2.info('{}', {42} as Supplier)
log2.info('{}', [{42}].toArray())
log2.info('{}', [{42}] as Supplier[])
log2.info('{}', [{42}] as Supplier<Long>[])
log2.info('{}', new Supplier() { Object get() { 42 } })
log2.info('{}', *[{42}])