1.搭建SpringBoot+Gradle项目,可参考:《SpringBoot+Gradle运行简单Demo Eclipse》
2.在gradle.build中添加jar包引用:
compile 'org.springframework.boot:spring-boot-starter-aop'
3.创建AspectLog.java类(类名可自定义):
package com.david.translate.aspect;
import javax.servlet.http.HttpServletRequest;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
@Aspect
@Component
public class AspectLog {
Logger log = LoggerFactory.getLogger(AspectLog.class);
/**
* http访问方法之前 切入
* 1.com.david.translate.controller.*.*
* 这个路径 是一直要指定到你的方法层级。
* 如:com.david.translate.controller.UserController。java
* 需要配置的execution就是 com.david.translate.controller.*.*(..)
* 第一个*指的是controller 下的所有类
* 第二个*指的是类里面的所有方法
* 2.如果这块指定的目录没有到方法,则会跑出异常。
* @param join
*/
@Before("execution(public * com.david.translate.controller.*.*(..))")
public void beforLog(JoinPoint join){
ServletRequestAttributes attriButes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequest request = attriButes.getRequest();
//打印url
log.info("url:{}", request.getRequestURL());
//打印请求方式
log.info("requet_method:{}", request.getMethod());
//打印类方法
log.info("class_method:{}", join.getStaticPart().getSignature().getDeclaringTypeName()
+ "."
+ join.getSignature().getName());
//打印参数
log.info("parameter:{}", join.getArgs());
//打印Ip
log.info("ip:{}", request.getLocalAddr());
}
/**
* http访问方法之后切入
*/
@After("execution(public * com.david.translate.controller.*.*(..))")
public void afterLog(){
log.info("http request after info!");
}
/**
* 打印返回的数据
* 1.returning 的值 和 resultLog中的入参一致
* 2.pointcut 配置的是需要切入的配置
* @param obj
*/
@AfterReturning(returning="obj", pointcut="execution(public * com.david.translate.controller.*.*(..))")
public void resultLog(Object obj){
log.info("return:{}", obj.toString());
}
}
3.编译并运行Spring Boot,并访问controller方法,打印日志如下: