有没有一种简洁的方式在Groovy中记录方法的执行结果?

5

我经常这样做来记录方法调用的输出:

def someMethod() {
    def retVal = //stuff

    log.debug("The return value is: $retVal")
    retVal
}

这似乎是为了记录方法的返回值而进行的许多仪式。我知道可以使用面向方面编程(AOP)来完成这种事情,但我希望只使用Groovy来实现。
Groovy有一个很棒的@Memoize注释,可以自动缓存方法调用,那么它是否有类似的@LogReturn注释来实现我的目标呢?
理想情况下,我希望得到像这样简洁的东西:
@LogReturn("debug")
def someMethod() {
    // Stuff
}

注意1:我知道可以使用元编程将该方法包装在另一个方法中,但是我希望能够通过注释更明确地表达。

注意2:我也愿意听取以其他方式实现此操作的建议。

2个回答

2
我不确定Groovy核心中是否存在记录返回值的注释。尽管如此,我认为通过一些AST转换应该是可能的。如果您遵循这个文档,它会做类似的事情,即记录带注释方法的进入和退出,但不打印返回值。
这篇博客展示了如何捕获返回值以进行缓存,您可以使用它来记录日志。我怀疑您需要小心,因为这假定最后一个语句是返回值,所以如果您在最后一个语句之前显式返回,这可能无法正常工作。这只是我的猜测,我自己没有尝试过。

-2

你可以在Groovy中使用日志注解。

   @groovy.util.logging.Log
   class Person {
       def method() {
        ...
        log.fine(runLongDatabaseQuery())
       }
   }   
   new Person().method()

@Log系列的注解都有一个可选参数:日志变量的名称。默认情况下,日志变量被称为“log”,但您可以将其更改为任何您想要的名称。

技巧:您可以注入@groovy.util.logging.Slf4j并将其用作静态final org.slf4j.Logger注入到您的类中,并使用@Slf4j(自groovy 1.8以来)进行初始化。与logback框架集成非常有用。


这根本没有达到我想要的效果。我不想要明确地记录方法的return值,我希望由其他东西完成它。目标是仍然获得日志记录,但保持方法体“纯净”。 - cdeszaq

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接