0
点赞
收藏
分享

微信扫一扫

日志系列---【SpringBoot使用Aop实现格式化日志】

1.最终实现效果

日志系列---【SpringBoot使用Aop实现格式化日志】_spring

 

2.在pom中引入Aop依赖(可以先写个@Aspect注解,如果不报错,说明项目中引入过aop依赖了,不用再重复引入下面的依赖)

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

3.这里我项目中用了swagger,为了不重复写注释,我直接用了@ApiOperation注解作为切点,当然,也可以自定义注解,把ApiOperation换成自定义的就行了。

package com.system.annotation.Handler;

import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import javax.servlet.http.HttpServletRequest;
import java.lang.reflect.Method;

@Slf4j
@Aspect
@Component
public class LogHandler {

@Pointcut("@annotation(io.swagger.annotations.ApiOperation)")
public void webLog() {
}

@Around("webLog()")
public Object doAround(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
long startTime = System.currentTimeMillis();
Object result = proceedingJoinPoint.proceed();
//打印出参
log.info("Response Args : {}", result);
//执行耗时
log.info("exe-time : {} ms", System.currentTimeMillis() - startTime);
log.info("============================================End==================================================="+System.lineSeparator());
return result;
}

@Before("webLog()")
public void doBefore(JoinPoint joinPoint){
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequest request = attributes.getRequest();
MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature();
Method method = methodSignature.getMethod();
ApiOperation annotation = method.getAnnotation(ApiOperation.class);
String msg = annotation.value();
log.info(System.lineSeparator());
log.info("============================================Start=================================================");
//打印请求的url
log.info("URL : {}",request.getRequestURL().toString());
log.info("Description : {}",msg);
log.info("HTTP Method : {}",request.getMethod());
log.info("Class Method : {},{}",joinPoint.getSignature().getDeclaringTypeName(),joinPoint.getSignature().getName());
log.info("IP : {}",request.getRemoteAddr());
Object[] args = joinPoint.getArgs();
log.info("Request Args : {}",args);
}

@After("webLog()")
public void doAfter() throws Throwable{
log.info("==========================================Response=================================================");
}
}

4.自定义注解(可以不自定义,我直接用的ApiOperation)

package com.jiulong.springboot_validator.annotation;

import java.lang.annotation.*;

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD})
@Documented
public @interface WebLog {

/**
* 日志描述信息
*
* @return String
*/
String value() default "";
}
举报

相关推荐

0 条评论