springboot+log4j统一处理请求日志(AOP)

项目当中经常需要对请求日志进行统一处理,以便能够及时的掌握项目功能情况,下面简单介绍springboot利用log4j如何用AOP对所有请求统一记录。

1. springboot集成log4j

具体详见springboot配置集成log4j

2. 导入AOP依赖

<!-- AOP -->
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-aop</artifactId>
</dependency>

3. WebLogAspect切面类

@Aspect
@Component//配置bean
public class WebLogAspect {
    private Logger logger = Logger.getLogger(getClass());

    @Pointcut("execution(public * com.test.controller..*.*(..))")
    public void webLog() {

    }

    @Before("webLog()")
    public void doBefore(JoinPoint joinPoint) throws Throwable {
        // 接收到请求,记录请求内容
        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        HttpServletRequest request = attributes.getRequest();
        // 记录下请求内容
        logger.info("---------------request----------------");
        logger.info("URL : " + request.getRequestURL().toString());
        logger.info("HTTP_METHOD : " + request.getMethod());
        logger.info("IP : " + request.getRemoteAddr());
        Enumerationenu = request.getParameterNames();
        while (enu.hasMoreElements()) {
            String name = (String) enu.nextElement();
            logger.info("name:" + name + " - value:" + request.getParameter(name));
        }
    }
    @AfterReturning(returning = "ret", pointcut = "webLog()")
    public void doAfterReturning(Object ret) throws Throwable {
        logger.info("---------------response----------------");
        // 处理完请求,返回内容
        logger.info("RESPONSE : " + ret);
	logger.info("花费时间 : " + (System.currentTimeMillis() - startTime.get()) + "毫秒");
    }
}

通过@Pointcut定义切入点,此处是com.test.controller包下的所有Controller(对controller层所有请求处理做切入点),然后通过@Before实现对请求内容的日志记录,最后通过@AfterReturning记录请求返回的对象。

这样所有功能的请求参数,返回数据,以及运行时间等都可以统一记录,不需要在每个方法去单独处理。


版权声明:本文为JAVASCHOOL原创文章,未经本站允许不得转载。