2012-06-19 4 views
3

Grails 앱 실행 중에 액세스 한 MY 클래스를 모니터링하고 싶습니다. 이 목적을 위해 나는 모든 커스텀 클래스에 '이전의 메소드 호출'에 로깅을 추가 한 다음 로그 파일을 검사 할 생각이다. 기존 클래스를 수정하지 않고 이러한 인터셉터 로직을 추가하는 가장 슬픈 방법은 무엇입니까?Grails에서 모든 맞춤 클래스 차단하기

메타 프로그래밍/AOP?

+0

groovy [invokeMethod 및 getProperty] (http://groovy.codehaus.org/Using+invokeMethod+and+getProperty) 기능을 사용하는 것이 좋습니다. –

+1

아마도 관련이 있습니다 : http://stackoverflow.com/q/10956841/6509 –

+0

@ Fabiano 그러나 이것은 기존 코드를 수정 (구현/재정의)하는 것을 의미합니다. 나는 논리가 외부화되고 모든 수업에 한 번에 묶이기를 원합니다. – fizmax

답변

3

스프링 AOP를 사용하십시오.

, 당신이 원하는 클래스에있는 모든 방법을 차단 resources.groovy에 빈 선언이를 추가하려면

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] 스프링 AOP가 빈에서 사용하기위한의 네임 스페이스와 스키마에 제공 작성자

[2] 메소드 서명 패턴. 이 사람은 my.basepkg에서 모든 클래스의 모든 방법과 일치하거나 인터셉터의 메시지를 기록하는 데 사용됩니다 최우선 loggerName와 함께

[3] 바인딩 포인트 컷과 조언

[4] 조언 빈 선언을 서브 패키지됩니다. 이 같은 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