是否有一种干净的方法来记录Groovy中方法的结果?

时间:2014-04-19 18:45:57

标签: logging groovy annotations return-value

为了记录方法调用的输出,我经常发现自己正在做这样的事情:

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 个答案:

答案 0 :(得分:2)

我不知道在groovy核心中是否存在任何会记录返回值的注释。话虽如此,我认为应该可以进行一些AST转换。如果您遵循this文档,它确实有些类似,即日志条目和存在于带注释的方法但不打印返回值。

这个blog显示了如何捕获返回的缓存值,您可以使用它来进行日志记录。我怀疑你需要小心,因为这假设最后一个语句是一个返回值,所以如果你在最后一个语句之前显式返回,这可能不起作用。这只是我的猜测,我自己没有尝试过。

答案 1 :(得分:-2)

您可以使用groovy的日志注释。

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

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

技巧:您可以注入@groovy.util.logging.Slf4j并将其作为静态最终org.slf4j.Logger用于您的类,并使用@Slf4j初始化它(因为groovy 1.8)。用于与logback框架集成。