2

メソッドエントリ (パラメーター値を含む) をログに記録し、Spring AOP と log4j をトレースレベルで終了する方法については、誰でも知っています。複数のパッケージからクラスをログに記録できる必要があります。

4

2 に答える 2

6

このような目的で@Around(..)アスペクトを使用できます。

@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 with exception  
             logger.error(errorMessageStringBuffer.toString(), ex);    
            throw ex;
        }

        return retVal;
    }
}

この例では、アスペクトはcom.blablabla.serverパッケージの下のすべてのサブパッケージのすべてのメソッド呼び出しをログに記録します。また、すべてのメソッド入力パラメーターをログに記録します。

于 2012-08-09T10:56:49.917 に答える
1

Spring フレームワークの PerformanceMonitorInterceptor を使用して、メソッド エントリをログに記録できます。DZoneの使用例を次に示します。

于 2012-08-09T10:26:01.270 に答える