1、添加依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.62</version>
</dependency>
2、自定义注解
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
@Documented
public @interface LogAop {
/**
* 接口描述
*/
String desc() default "";
}
注解说明:
- @Retention(RetentionPolicy.RUNTIME):注解的生命周期为运行时
- @Target(ElementType.METHOD):注解作用于方法
- @Documented:该注解可以被JavaDoc记录
3、配置切面
@Component
//告诉spring,这个一个切面类,里面可以定义切入点和通知
@Aspect
public class LogAdvice {
Logger logger = LoggerFactory.getLogger(LogAdvice.class);
/**
* 切入点
*/
@Pointcut("@annotation(com.annotation.LogAop)")
public void logAop(){}
/**
* 环绕通知
* @param joinPoint
* @return
* @throws Throwable
*/
@Around("logAop()")
public Object arround(ProceedingJoinPoint joinPoint) throws Throwable {
//请求开始时间戳
long begin = System.currentTimeMillis();
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequest request = attributes.getRequest();
Signature signature = joinPoint.getSignature();
MethodSignature methodSignature = (MethodSignature) signature;
Method method = methodSignature.getMethod();
LogAop logApp = method.getAnnotation(LogAop.class);
//接口描述信息
String desc = logApp.desc();
logger.info("====================================开始请求========================================");
//请求链接
logger.info("请求链接:{}", request.getRequestURL().toString());
//接口描述信息
logger.info("接口描述:{}",desc);
//请求类型
logger.info("接口类型:{}",request.getMethod());
//请求方法
logger.info("请求方法:{}.{}",signature.getDeclaringTypeName(),signature.getName());
//请求IP
logger.info("请求IP:{}",request.getRemoteAddr());
//请求入参
logger.info("请求入参:{}", JSON.toJSONString(joinPoint.getArgs()));
Object result = joinPoint.proceed();
//请求结束时间戳
long end = System.currentTimeMillis();
//请求耗时
logger.info("请求耗时:{}",end-begin);
//请求返回
logger.info("请求返回:{}",JSON.toJSONString(result));
logger.info("====================================开始结束========================================");
return result;
}
}
4、使用注解
@LogAop(desc = "记录接口日志")
@RequestMapping("/logAop")
public String hello(@RequestBody Map<String,Object> paramMap){
if (paramMap != null) {
Object name = paramMap.get("name");
if (name != null) {
return name.toString();
}
}
return null;
}
5、测试
接下来就可以对日志做进一步处理