2014-04-19 10 views
5

ich finde mich oft so etwas wie dies tun, um die Ausgabe eines Methodenaufruf zu protokollieren:Gibt es eine saubere Möglichkeit, das Ergebnis einer Methode in Groovy zu protokollieren?

def someMethod() { 
    def retVal = //stuff 

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

Diese wie viele Zeremonie scheint nur den Rückgabewert des Verfahrens zu protokollieren. Ich weiß, dass ich Aspect Oriented Programming (AOP) verwenden kann, um so etwas zu tun, aber ich hatte gehofft, es nur mit Groovy zu machen.

Groovy hat die große @Memoize Annotation zu Auto-Memoize Methodenaufrufe, also hat es eine ähnliche @LogReturn Art von Annotation zu tun, was ich danach bin?

Idealerweise würde ich etwas sauber, wie dies erwartet:

@LogReturn("debug") 
def someMethod() { 
    // Stuff 
} 

Anmerkung 1: Ich weiß, ich Meta-Programmierung die Methode in einem anderen Verfahren zu wickeln verwenden könnte, aber ich habe gehofft, in der Lage sein machen es noch deutlicher mit einer Anmerkung

Anmerkung 2: ich bin auch offen für Vorschläge für diese in einer anderen Art und Weise erreichen

Antwort

2

ich weiß nicht, ob Solche Annotationen, die den Rückgabewert protokollieren, existieren im groovigen Kern. Nachdem ich das gesagt habe, denke ich, dass es mit einer AST-Transformation möglich sein sollte. Wenn Sie dem Dokument this folgen, verhält es sich etwas ähnlich, d. H. Protokolliert den Eintrag und existiert für die mit Annotationen versehene Methode, druckt jedoch nicht den Rückgabewert.

Diese blog zeigt, wie der zurückgegebene Wert für das Zwischenspeichern abgefangen wird, Sie können stattdessen das zum Protokollieren verwenden. Ich vermute, dass Sie vorsichtig sein müssen, da dies voraussetzt, dass die letzte Anweisung ein Rückgabewert ist. Wenn Sie also explizit vor der letzten Anweisung zurückgeben, funktioniert dies möglicherweise nicht. Das ist nur meine Vermutung, ich habe es selbst nicht versucht.

-2

Sie können Log Annotation mit groovy verwenden.

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

Die @Log Familie von Annotationen alle nehmen einen optionalen Parameter: den Namen der Log-Variable. Standardmäßig heißt die Protokollvariable 'log', aber Sie können sie beliebig ändern.

Trick: Sie können @groovy.util.logging.Slf4j injizieren und es als statische final org.slf4j.Logger in Ihre Klasse verwenden und initialisiert es mit @Slf4j (seit groovy 1.8). Nützlich für die Integration in das Logback-Framework.

+0

Dies erreicht nicht, was ich überhaupt will. Ich möchte nicht explizit den Rückgabewert meiner Methode protokollieren müssen, ich möchte, dass sie von etwas anderem ausgeführt wird. Das Ziel ist es, immer noch die Protokollierung zu erhalten, aber den Körper der Methode "rein" zu halten – cdeszaq

Verwandte Themen