ControllerMonitor.java

package com.saltynote.service.aop;

import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

@Aspect
@Component
@Slf4j
public class ControllerMonitor {

    @Pointcut("execution(* com.saltynote.service.controller.*Controller.*(..))")
    public void monitor() {
        // utility method for aop
    }

    @Around("monitor()")
    public Object logServiceAccess(ProceedingJoinPoint pjp) throws Throwable {
        long start = System.currentTimeMillis();
        Object output = pjp.proceed();
        long elapsedTime = System.currentTimeMillis() - start;
        String target = pjp.getSignature().getDeclaringType().getSimpleName() + "_" + pjp.getSignature().getName();
        log.info(target + " execution time: " + elapsedTime + " milliseconds.");
        return output;
    }

}