2013-06-10 4 views
0

시나리오 : 우리는 서버의 메모리 사용량이 최대 90 %까지 올라가는 불필요한 로깅을 발견했는데, 이는 바람직하지 않습니다. 범인은 log.info와 같은 로깅 구문을 많이 가지고 있으며이 환경에 대한 액세스 권한이없는 환경이지만 스프링 구성 XML에 액세스 할 수있는 클래스입니다. 클래스에 aspect를 적용 할 수 있습니까? 특히 log.info 문을 중지하는 방법은 무엇입니까?봄 AOP를 사용하는 메소드에서 라인을 실행하지 않는 방법이 있습니까?

+4

왜 그 클래스에 대한 로깅을 재구성하지 않는가?! 어쨌든 Spring AOP는 특정 라인을 건너 뛰는 것을 허용하지 않을 것이다. AspectJ 자체는 다양한 방법을 통해 컴파일 된 클래스의 바이트 코드를 조작 할 수도있다. 하지만 로깅을 올바르게 구성하는 IMO가 최선의 방법입니다. –

+0

@DaveNewton 로깅을 구성하는 것이 로그 문이'if (log.isInfoEnable()) {...} '문에 캡슐화되지 않은 경우 성능을 향상시키는 데 도움이되지 않을 수 있으며 출력 계산에 비용이 소요됩니다 . –

+0

@Dave Newton, 로깅 수준을 재구성 해 주셔서 감사합니다. 그러나이 시점에서 나는 신속하게 해결할 수 없으므로 Spring 구성에서 신속한 솔루션이 필요합니다. 봄 설정 파일을 대체 할 수있는 액세스 권한이 있으므로 AOP를 활용할 수 있을지 생각하고 있습니다. – Gourabp

답변

0

질문 바로 아래에 의견에 동의합니다 : 로깅을 다시 구성하면됩니다.

기술적으로 Spring AOP를 사용하면 Spring bean 메소드 호출 또는 실행을 인터셉트 할 수 있습니다. 로깅 호출이 Spring 빈에 캡슐화되지 않는 한, Spring AOP는 유용하지 않을 것이다.

AspectJ에서는 로깅 라이브러리에 LTW (로딩 타임 위빙)을 적용하고 특정 제어 흐름에 의해 호출되는 로깅 메소드의 실행을 차단할 수 있습니다. 응용 프로그램 코드를 작성한 다음 특정 제어 흐름 내에서 로깅 메소드 호출을 차단하여 동일한 작업을 수행 할 수도 있습니다.

면책 조항 : 이것은 양 측면에서 쉽게 구현되지만 제작 관리자가 대상 시스템에서 AspectJ를 사용할 수 있는지 여부는 알 수 없습니다. 애스펙트를 자신의 프로덕션 코드로 컴파일하더라도 적어도 애플리케이션의 클래스 경로에는 AspectJ 런타임 (aspectjrt.jar)이 필요하다.