2012-08-09 2 views
1

누구나 메소드 엔트리 (파라미터 값 포함)를 로그하고 Spring AOP 및 log4j를 트레이스 레벨에서 종료하는 방법에 대한 아이디어가 있습니다. 여러 패키지의 클래스를 기록 할 수 있어야합니다.Spring AOP로 메소드 엔트리 로그하기

답변

2

Spring 프레임 워크의 PerformanceMonitorInterceptor를 사용하여 메소드 항목을 기록 할 수 있습니다. Here은 DZone의 샘플 사용법입니다. 모든 방법은 com.blablabla.server 패키지 아래의 모든 하위 패키지를 요구 측면 로그 주변이 예에서

@Component 
@Aspect 
@Order(value=2) 
public class LoggingAspect { 

    @Around("execution(* com.blablabla.server..*.*(..))") 
    public Object logMethod(ProceedingJoinPoint joinPoint) throws Throwable{ 
     final Logger logger = LoggerFactory.getLogger(joinPoint.getTarget().getClass().getName()); 
     Object retVal = null; 

     try { 
      StringBuffer startMessageStringBuffer = new StringBuffer(); 

      startMessageStringBuffer.append("Start method "); 
      startMessageStringBuffer.append(joinPoint.getSignature().getName()); 
      startMessageStringBuffer.append("("); 

      Object[] args = joinPoint.getArgs(); 
      for (int i = 0; i < args.length; i++) { 
       startMessageStringBuffer.append(args[i]).append(","); 
      } 
      if (args.length > 0) { 
       startMessageStringBuffer.deleteCharAt(startMessageStringBuffer.length() - 1); 
      } 

      startMessageStringBuffer.append(")"); 

      logger.trace(startMessageStringBuffer.toString()); 

      StopWatch stopWatch = new StopWatch(); 
      stopWatch.start(); 

      retVal = joinPoint.proceed(); 

      stopWatch.stop(); 

      StringBuffer endMessageStringBuffer = new StringBuffer(); 
      endMessageStringBuffer.append("Finish method "); 
      endMessageStringBuffer.append(joinPoint.getSignature().getName()); 
      endMessageStringBuffer.append("(..); execution time: "); 
      endMessageStringBuffer.append(stopWatch.getTotalTimeMillis()); 
      endMessageStringBuffer.append(" ms;"); 

      logger.trace(endMessageStringBuffer.toString()); 
     } catch (Throwable ex) { 
      StringBuffer errorMessageStringBuffer = new StringBuffer(); 

      // Create error message 
      logger.error(errorMessageStringBuffer.toString(), e) 

      throw ex; 
     } 

     return retVal; 
    } 
} 

:

4

당신은 @Around (..) 등의 목적으로 측면을 사용할 수 있습니다. 또한 모든 메소드 입력 매개 변수를 기록합니다.

관련 문제