我想監視在Grails應用程序執行期間哪些MY類被訪問過。爲此,我正在考慮將「日誌方法調用前」的日誌記錄添加到所有自定義類中,然後檢查日誌文件。 在不修改現有類的情況下添加這種攔截邏輯的最明智的方式是什麼?攔截Grails中的所有自定義類
Metaprogramming/AOP?
我想監視在Grails應用程序執行期間哪些MY類被訪問過。爲此,我正在考慮將「日誌方法調用前」的日誌記錄添加到所有自定義類中,然後檢查日誌文件。 在不修改現有類的情況下添加這種攔截邏輯的最明智的方式是什麼?攔截Grails中的所有自定義類
Metaprogramming/AOP?
使用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,這很簡單)。
對不起,你必須自己回答,但我對這個問題很感興趣。 – avgvstvs
解決方案是使用groovy [invokeMethod和getProperty](http://groovy.codehaus.org/Using+invokeMethod+and+getProperty)功能。 –
也許相關:http://stackoverflow.com/q/10956841/6509 –
@Fabiano但這意味着修改現有的代碼(執行/覆蓋)。我希望邏輯被外化,並且一次綁定到我所有的類。 – fizmax