Grails アプリの実行中にアクセスされた MY クラスを監視したいと考えています。この目的のために、すべてのカスタム クラスに「メソッド呼び出し前」ジョイントへのログインを追加し、ログ ファイルを検査することを考えています。既存のクラスを変更せずに、そのような傍受ロジックを追加する最も巧妙な方法は何ですか?
メタプログラミング/AOP?
Grails アプリの実行中にアクセスされた MY クラスを監視したいと考えています。この目的のために、すべてのカスタム クラスに「メソッド呼び出し前」ジョイントへのログインを追加し、ログ ファイルを検査することを考えています。既存のクラスを変更せずに、そのような傍受ロジックを追加する最も巧妙な方法は何ですか?
メタプログラミング/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 が Bean ビルダーで使用するための名前空間とスキーマを取り込みます
[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 を拡張するだけです。簡単です)。