c语言编程笔录

首页 >   > 笔记大全

笔记大全

Spring如利用aop操作日志功

更新时间:2023-11-12

前言:

Spring是目前使用较为广泛的Java开源框架之一,其优点包括完善的依赖注入、面向切面编程(AOP)、模块化开发等特点。本文将介绍如何在Spring框架下,利用AOP来操作日志功能。

第一段:

在Spring框架下,通过使用AOP可以轻松实现对系统日志的记录。Spring的AOP模块使用了AspectJ注解来实现切面编程,在AspectJ中,切面就是一个特殊的Java类,它包含了一些Advice和Pointcut。Advice定义了在何时、何地、以何种方式对目标对象进行修改的代码;而Pointcut则决定了Advice将会在哪些切点执行。

@Aspect
public class LogAspect {

    //定义切点
    @Pointcut("execution(* com.example.demo..*.*(..))")
    public void webLog() {}

    //前置通知
    @Before("webLog()")
    public void doBefore(JoinPoint joinPoint) {
        //获取请求ip、url等信息并记录日志
        Logger logger = LoggerFactory.getLogger(joinPoint.getTarget().getClass());
        logger.info("Request URL:", ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest().getRequestURL());
        logger.info("Request Method:", ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest().getMethod());
    }

    //后置通知
    @AfterReturning(returning = "ret", pointcut = "webLog()")
    public void doAfterReturning(Object ret) {
        //处理完请求后返回内容并记录日志
        Logger logger = LoggerFactory.getLogger(getClass());
        logger.info("Response:", ret);
    }
}

第二段:

上述代码中,我们定义了一个LogAspect类,使用了@Aspect注解来表明它是一个切面类。在LogAspect切面类中,我们使用了@Pointcut来定义切点。这里的Pointcut表达式表示拦截com.example.demo包及其子包下所有类的所有方法。@Before注解定义了前置Advice,它在目标方法执行之前执行,用来记录请求信息。@AfterReturning注解定义了后置Advice,它在目标方法返回之后执行,用来记录响应信息。需要注意的是,为了获取HttpServletRequest对象,我们需要使用ServletRequestAttributes类和RequestContextHolder类。

第三段:

在LogAspect切面类中,我们还可以使用其他类型的Advice,如@After、@Around、@AfterThrowing等。其中,@After用于记录一些常规的清理工作;@Around用于包装目标方法,可以在目标方法执行前后对其进行处理;@AfterThrowing用于捕获目标方法抛出的异常。以下是一个示例:

//定义切点
@Pointcut("execution(* com.example.demo..*.*(..))")
public void webLog() {}

//环绕通知
@Around("webLog()")
public Object arround(ProceedingJoinPoint pjp) throws Throwable {
    //获取请求ip、url等信息并记录日志
    Logger logger = LoggerFactory.getLogger(pjp.getTarget().getClass());
    logger.info("Request URL:", ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest().getRequestURL());
    logger.info("Request Method:", ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest().getMethod());

    //执行目标方法,并记录响应信息
    Object result = pjp.proceed();
    logger.info("Response:", result);

    return result;
}

第四段:

在应用程序中引入LogAspect切面类之后,只需要在需要记录日志的类中添加一个@LogAspect注解即可。

@LogAspect
@RestController
public class UserController {

    @GetMapping("/hello")
    public String sayHello() {
        return "Hello, world!";
    }
}

通过上述实现,我们可以方便地利用Spring的AOP模块,实现对系统日志的记录。这不仅可以方便快捷地帮助我们定位问题,也是开发高质量、可靠的应用程序的必要手段之一。