我们可以通过aspect进行无侵入式的日志记录,
具体代码如下:
@Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface LogOperation { String value() default ""; }
并定义切面,然后,通过@Around("logPointCut()")注解,你定义了一个环绕通知(Around Advice),它将围绕着上述切点定义的方法执行。这意味着,每当有方法被@LogOperation注解标记,并被调用时,around方法就会被触发。在这个方法内部,你可以在目标方法执行前后添加自定义逻辑,比如记录日志、计算执行时间等。
/** * 系统⽇志,切⾯处理类 */ @Aspect @Component public class LogOperationAspect { @Autowired private SysLogOperationService sysLogOperationService; @Pointcut("@annotation(cn.sanshu.common.annotation.LogOperation)") public void logPointCut() { } @Around("logPointCut()") public Object around(ProceedingJoinPoint point) throws Throwable { long beginTime = System.currentTimeMillis(); try { //执⾏⽅法 Object result = point.proceed(); //执⾏时⻓(毫秒) long time = System.currentTimeMillis() - beginTime; //保存⽇志 saveLog(point, time, OperationStatusEnum.SUCCESS.value()); return result; }catch(Exception e) { //执⾏时⻓(毫秒) long time = System.currentTimeMillis() - beginTime; //保存⽇志 saveLog(point, time, OperationStatusEnum.FAIL.value()); throw e; } } private void saveLog(ProceedingJoinPoint joinPoint, long time, Integer status) { //逻辑对象处理 //保存到DB sysLogOperationService.save(log); } }