From 009b25f4d8041779a6214b0a3a16e35759ea9a9a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E5=B0=8F=E4=B8=9C?= <13396135+anton-aoi@user.noreply.gitee.com> Date: Tue, 21 Nov 2023 21:26:14 +0800 Subject: [PATCH] =?UTF-8?q?Aop=E6=97=A5=E5=BF=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- february-vehicle-common/pom.xml | 12 ++ .../february/common/domain/aspect/WebLog.java | 16 +++ .../common/domain/aspect/WebLogAspect.java | 117 ++++++++++++++++++ .../controller/TrajectoryController.java | 23 ++-- .../src/main/resources/bootstrap.yml | 6 + 5 files changed, 166 insertions(+), 8 deletions(-) create mode 100644 february-vehicle-common/src/main/java/com/february/common/domain/aspect/WebLog.java create mode 100644 february-vehicle-common/src/main/java/com/february/common/domain/aspect/WebLogAspect.java diff --git a/february-vehicle-common/pom.xml b/february-vehicle-common/pom.xml index 491369a..adb4b3c 100644 --- a/february-vehicle-common/pom.xml +++ b/february-vehicle-common/pom.xml @@ -68,6 +68,18 @@ org.projectlombok lombok + + + + org.springframework.boot + spring-boot-starter-aop + + + + com.google.code.gson + gson + 2.8.5 + diff --git a/february-vehicle-common/src/main/java/com/february/common/domain/aspect/WebLog.java b/february-vehicle-common/src/main/java/com/february/common/domain/aspect/WebLog.java new file mode 100644 index 0000000..f9b0b94 --- /dev/null +++ b/february-vehicle-common/src/main/java/com/february/common/domain/aspect/WebLog.java @@ -0,0 +1,16 @@ +package com.february.common.domain.aspect; +import java.lang.annotation.*; + +/** + * 切面 + */ +@Retention(RetentionPolicy.RUNTIME) +@Target({ElementType.METHOD}) +@Documented +public @interface WebLog { + /** + * 日志描述信息 + * @return + **/ + String description() default ""; +} diff --git a/february-vehicle-common/src/main/java/com/february/common/domain/aspect/WebLogAspect.java b/february-vehicle-common/src/main/java/com/february/common/domain/aspect/WebLogAspect.java new file mode 100644 index 0000000..d5e2350 --- /dev/null +++ b/february-vehicle-common/src/main/java/com/february/common/domain/aspect/WebLogAspect.java @@ -0,0 +1,117 @@ +package com.february.common.domain.aspect; + +import com.alibaba.nacos.shaded.com.google.gson.Gson; +import org.aspectj.lang.JoinPoint; +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.*; +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; + +import javax.servlet.http.HttpServletRequest; +import java.lang.reflect.Method; + +/** + * AOP日志 + */ +@Aspect +@Component +//@Profile({"dev", "test"}) //只想在开发环境或者测试环境中使用 +public class WebLogAspect { + + private final static Logger logger = LoggerFactory.getLogger(WebLogAspect.class); + /** 换行符 */ + private static final String LINE_SEPARATOR = System.lineSeparator(); + + /** 以自定义 @WebLog 注解为切点 */ + @Pointcut("@annotation(com.february.common.domain.aspect.WebLog)") + public void webLog() {} + + /** + * 在切点之前织入 + * @param joinPoint + * @throws Throwable + */ + @Before("webLog()") + public void doBefore(JoinPoint joinPoint) throws Throwable { + // 开始打印请求日志 + ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); + HttpServletRequest request = attributes.getRequest(); + + // 获取 @WebLog 注解的描述信息 + String methodDescription = getAspectLogDescription(joinPoint); + + // 打印请求相关参数 + logger.info("========================================== Start =========================================="); + // 打印请求 url + logger.info("URL : {}", request.getRequestURL().toString()); + // 打印描述信息 + logger.info("Description : {}", methodDescription); + // 打印 Http method + logger.info("HTTP Method : {}", request.getMethod()); + // 打印调用 controller 的全路径以及执行方法 + logger.info("Class Method : {}.{}", joinPoint.getSignature().getDeclaringTypeName(), joinPoint.getSignature().getName()); + // 打印请求的 IP + logger.info("IP : {}", request.getRemoteAddr()); + // 打印请求入参 + logger.info("Request Args : {}", new Gson().toJson(joinPoint.getArgs())); + } + + /** + * 在切点之后织入 + * @throws Throwable + */ + @After("webLog()") + public void doAfter() throws Throwable { + // 接口结束后换行,方便分割查看 + logger.info("=========================================== End ===========================================" + LINE_SEPARATOR); + } + + /** + * 环绕 + * @param proceedingJoinPoint + * @return + * @throws Throwable + */ + @Around("webLog()") + public Object doAround(ProceedingJoinPoint proceedingJoinPoint) throws Throwable { + long startTime = System.currentTimeMillis(); + Object result = proceedingJoinPoint.proceed(); + // 打印出参 + logger.info("Response Args : {}", new Gson().toJson(result)); + // 执行耗时 + logger.info("Time-Consuming : {} ms", System.currentTimeMillis() - startTime); + return result; + } + + + /** + * 获取切面注解的描述 + * + * @param joinPoint 切点 + * @return 描述信息 + * @throws Exception + */ + public String getAspectLogDescription(JoinPoint joinPoint) + throws Exception { + String targetName = joinPoint.getTarget().getClass().getName(); + String methodName = joinPoint.getSignature().getName(); + Object[] arguments = joinPoint.getArgs(); + Class targetClass = Class.forName(targetName); + Method[] methods = targetClass.getMethods(); + StringBuilder description = new StringBuilder(""); + for (Method method : methods) { + if (method.getName().equals(methodName)) { + Class[] clazzs = method.getParameterTypes(); + if (clazzs.length == arguments.length) { + description.append(method.getAnnotation(WebLog.class).description()); + break; + } + } + } + return description.toString(); + } + +} diff --git a/february-vehicle-server/src/main/java/com/vehicle/trajectory/controller/TrajectoryController.java b/february-vehicle-server/src/main/java/com/vehicle/trajectory/controller/TrajectoryController.java index ed05e8b..87c7c23 100644 --- a/february-vehicle-server/src/main/java/com/vehicle/trajectory/controller/TrajectoryController.java +++ b/february-vehicle-server/src/main/java/com/vehicle/trajectory/controller/TrajectoryController.java @@ -5,8 +5,9 @@ import com.february.common.core.domain.Result; import com.february.common.domain.RealData; import com.february.common.domain.Vehicle; import com.february.common.domain.VehicleType; +import com.february.common.domain.aspect.WebLog; import com.vehicle.trajectory.service.TrajectoryService; -import lombok.extern.log4j.Log4j2; +import org.aspectj.lang.annotation.Aspect; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; @@ -15,7 +16,8 @@ import org.springframework.web.bind.annotation.RestController; import javax.servlet.http.HttpServletRequest; import java.util.List; -@Log4j2 +//@Log4j2 +@Aspect @RestController @RequestMapping("/vehicle") public class TrajectoryController { @@ -28,10 +30,11 @@ public class TrajectoryController { * 实时数据 */ @GetMapping("/realDateList") + @WebLog(description = "实时数据查看") public Result> realDateList() { - log.info("功能名称:【实时数据查看】,请求路径:【{}】,请求方式:【{}】", request.getRequestURI(), request.getMethod()); + //log.info("功能名称:【实时数据查看】,请求路径:【{}】,请求方式:【{}】", request.getRequestURI(), request.getMethod()); Result> result = trajectoryService.realDateList(); - log.info("请求结果:【{}】", result); + //log.info("请求结果:【{}】", result); return result; } @@ -41,10 +44,11 @@ public class TrajectoryController { * 车辆信息 */ @GetMapping("/vehicleList") + @WebLog(description = "查看在线车辆") public Result> carList() { - log.info("功能名称:【查看在线车辆】,请求路径:【{}】,请求方式:【{}】", request.getRequestURI(), request.getMethod()); + //log.info("功能名称:【查看在线车辆】,请求路径:【{}】,请求方式:【{}】", request.getRequestURI(), request.getMethod()); Result> result = trajectoryService.vehicleList(); - log.info("请求结果:【{}】", result); + //log.info("请求结果:【{}】", result); return result; } @@ -52,10 +56,13 @@ public class TrajectoryController { * 车辆类型 */ @GetMapping("/vehicleTypeList") + @WebLog(description = "车辆类型") public Result> vehicleTypeList(){ - log.info("功能名称:【车辆类型】,请求路径:【{}】,请求方式:【{}】",request.getRequestURI(),request.getMethod()); + + // log.info("功能名称:【车辆类型】,请求路径:【{}】,请求方式:【{}】",request.getRequestURI(),request.getMethod()); Result> result = trajectoryService.vehicleTypeList(); - log.info("请求结果:【{}】",result); + // log.info("请求结果:【{}】",result); + return result; } } diff --git a/february-vehicle-server/src/main/resources/bootstrap.yml b/february-vehicle-server/src/main/resources/bootstrap.yml index f847b0c..8c75861 100644 --- a/february-vehicle-server/src/main/resources/bootstrap.yml +++ b/february-vehicle-server/src/main/resources/bootstrap.yml @@ -23,3 +23,9 @@ spring: # 共享配置 shared-configs: - application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension} +# application.yml +logging: + level: + com.vehicle.trajectory.controller: INFO + pattern: + console: '%d{yyyy-MM-dd HH:mm:ss} - %msg%n'