2014-04-19 25 views
5

我經常發現自己做這樣的事情,爲了記錄一個方法調用的輸出:有沒有一種乾淨的方式來記錄Groovy中的方法的結果?

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

我不知道是否有實現這一建議groovy核心中會存在這樣一些記錄返回值的註釋。話雖如此,我認爲應該可以通過一些AST轉換。如果您遵循this文檔,它有點類似,即記錄條目並存在註釋方法但不打印返回值。

這個blog顯示瞭如何捕獲緩存的返回值,您可以改爲使用它來進行日誌記錄。我懷疑你需要小心,因爲這假定上一條語句是返回值,所以如果你在上次語句之前顯式返回,這可能不起作用。這只是我的猜測,我自己並沒有嘗試過。

-2

您可以在日誌中使用日誌註釋。

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

@Log註釋系列都帶有一個可選參數:日誌變量的名稱。默認情況下,日誌變量稱爲「日誌」,但您可以將其更改爲任何您想要的。

技巧:你可以注入@groovy.util.logging.Slf4j並將其作爲一個靜態的final org.slf4j.Logger加入你的類並使用@Slf4j(自groovy 1.8開始)初始化它。用於與logback框架集成。

+0

這並沒有達到我所追求的目標。我不想顯式記錄我的方法的'return'值,我希望它可以通過別的方法來完成。目標是仍然獲得伐木,但保持方法的「純」 – cdeszaq

相關問題