2012-06-19 29 views
3

我想監視在Grails應用程序執行期間哪些MY類被訪問過。爲此,我正在考慮將「日誌方法調用前」的日誌記錄添加到所有自定義類中,然後檢查日誌文件。 在不修改現有類的情況下添加這種攔截邏輯的最明智的方式是什麼?攔截Grails中的所有自定義類

Metaprogramming/AOP?

+0

解決方案是使用groovy [invokeMethod和getProperty](http://groovy.codehaus.org/Using+invokeMethod+and+getProperty)功能。 –

+1

也許相關:http://stackoverflow.com/q/10956841/6509 –

+0

@Fabiano但這意味着修改現有的代碼(執行/覆蓋)。我希望邏輯被外化,並且一次綁定到我所有的類。 – fizmax

回答

3

使用Spring AOP。

要攔截你想要的任何類的任何方法,這在resources.groovy添加到bean聲明:

xmlns aop: "http://www.springframework.org/schema/aop" //[1] 

aop { 
    config { 
     pointcut(id: "interceptorPointcut", expression: "execution(* my.basepkg..*(..))") //[2] 
     advisor('pointcut-ref': "interceptorPointcut", 'advice-ref': "myInterceptor") //[3] 
    } 
} 

myInterceptor(org.springframework.aop.interceptor.SimpleTraceInterceptor) { //[4] 
    loggerName = "myTracer" 
} 

[1]在Spring AOP的在豆腐使用的名稱空間和模式帶來的建造者

[2]方法簽名模式。這一個將在任何類my.basepkg匹配的任何方法或分裝

[3]結合切入點和通知

[4]的建議bean聲明與將用於登錄攔截的消息首要loggerName沿。添加到Config.groovy中是這樣的:

appenders { 
    rollingFile maxBackupIndex: 5, maxFileSize: '100KB', name: 'fileTracer', file: 'methodtrace.log', layout: pattern(conversionPattern: "%m%n") 
} 
trace additivity: false, fileTracer: 'myTracer' 

SimpleInterceptor是一個標準的Spring的攔截器,它記錄在每一個方法的消息進入/退出/異常。你可以使用它或org.springframework.aop.interceptor包中的另外一個,或者編寫你自己的(只需擴展AbstractTraceInterceptor,這很簡單)。

+0

對不起,你必須自己回答,但我對這個問題很感興趣。 – avgvstvs