import lombok.extern.slf4j.Slf4j; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; import org.springframework.stereotype.Component; import java.time.LocalDateTime; import java.time.ZoneOffset; @Aspect @Component @Slf4j public class ServiceLogAspect { /** * AOP通知: * 1. 前置通知:在方法调用之前执行 * 2. 后置通知:在方法正常调用之后执行 * 3. 环绕通知:在方法调用之前和之后,都分别可以执行的通知 * 4. 异常通知:如果在方法调用过程中发生异常,则通知 * 5. 最终通知:在方法调用之后执行 */ /** * 切面表达式: * execution 代表所要执行的表达式主体 * 第一处 * 代表方法返回类型 *代表所有类型 * 第二处 包名代表aop监控的类所在的包 * 第三处 .. 代表该包以及其子包下的所有类方法 * 第四处 * 代表类名,*代表所有类 * 第五处 *(..) *代表类中的方法名,(..)表示方法中的任何参数 * * @param joinPoint * @return * @throws Throwable */ @Around("execution(* com.imooc.service.impl..*.*(..))") public Object recordTimeLog(ProceedingJoinPoint joinPoint) throws Throwable{ log.info("==========开始执行 { }.{ } ==========", joinPoint.getSignature().getName(), joinPoint.getSignature().getName()); log.info("***********************************"); log.info(String.valueOf(joinPoint.getTarget().getClass()));//指向调用的对象 log.info(joinPoint.getSignature().getName());// 该方法主要获取被代理对象调用方法名称 //记录开始时间 Long begin= LocalDateTime.now().toInstant(ZoneOffset.of("+8")).toEpochMilli(); //执行目标 Object result=joinPoint.proceed(); //记录结束时间 Long end= LocalDateTime.now().toInstant(ZoneOffset.of("+8")).toEpochMilli(); //时间差 Long takeTime=end-begin; if (takeTime > 3000) { log.error("====== 执行结束,耗时:{} 毫秒 ======", takeTime); } else if (takeTime > 2000) { log.warn("====== 执行结束,耗时:{} 毫秒 ======", takeTime); } else { log.info("====== 执行结束,耗时:{} 毫秒 ======", takeTime); } return result; } }
控制台**************
INFO DispatcherServlet:524 - Initializing Servlet 'dispatcherServlet'
INFO DispatcherServlet:546 - Completed initialization in 16 ms
INFO ServiceLogAspect:40 - ==========开始执行 { }.{ } ==========
INFO ServiceLogAspect:43 - ***********************************
INFO ServiceLogAspect:44 - class com.imooc.service.impl.UsersServiceImpl
INFO ServiceLogAspect:45 - queryUsernameIsExist
Creating a new SqlSession
Registering transaction synchronization for SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@463def2]
INFO HikariDataSource:110 - DateSourceHikariCP - Starting...
INFO HikariDataSource:123 - DateSourceHikariCP - Start completed.
JDBC Connection [HikariProxyConnection@967435781 wrapping com.mysql.jdbc.JDBC4Connection@65c6cb48] will be managed by Spring
==> Preparing: select id, username, `password`, nickname, realname, face, mobile, email, sex, birthday, created_time, updated_time from users where username = ?
==> Parameters: 222(String)
<== Total: 0
Releasing transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@463def2]
INFO ServiceLogAspect:59 - ====== 执行结束,耗时:313 毫秒 ======
Transaction synchronization deregistering SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@463def2]
Transaction synchronization closing SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@463def2]