From 8d9ecc8455beec3d2a73bf8ecac3a3d9ef1b69df Mon Sep 17 00:00:00 2001 From: "MSI\\letre" Date: Wed, 2 Jul 2025 19:50:23 +0800 Subject: [PATCH] =?UTF-8?q?=E3=80=90=E6=96=B0=E5=A2=9E=E3=80=91=20?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0log=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../exam/exam/config/WebLogAspect.java | 70 +++++++++++++++++++ src/main/resources/logback.xml | 27 +++++++ 2 files changed, 97 insertions(+) create mode 100644 src/main/java/com/example/exam/exam/config/WebLogAspect.java create mode 100644 src/main/resources/logback.xml diff --git a/src/main/java/com/example/exam/exam/config/WebLogAspect.java b/src/main/java/com/example/exam/exam/config/WebLogAspect.java new file mode 100644 index 0000000..933afde --- /dev/null +++ b/src/main/java/com/example/exam/exam/config/WebLogAspect.java @@ -0,0 +1,70 @@ +package com.example.exam.exam.config; + +import com.fasterxml.jackson.databind.ObjectMapper; +import jakarta.servlet.http.HttpServletRequest; +import org.aspectj.lang.JoinPoint; +import org.aspectj.lang.annotation.*; +import org.aspectj.lang.reflect.MethodSignature; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; + +import java.lang.annotation.Annotation; +import java.lang.reflect.Method; +import java.util.HashMap; +import java.util.Map; + +@Aspect +@Component +public class WebLogAspect { + + private static final Logger logger = LoggerFactory.getLogger(WebLogAspect.class); + private final ObjectMapper objectMapper = new ObjectMapper(); + + private ThreadLocal startTime = new ThreadLocal<>(); + + @Pointcut("execution(* com.example..controller..*(..))") // ⚠ 修改为你自己的 Controller 包路径 + public void webLog() { + } + + @Before("webLog()") + public void doBefore(JoinPoint joinPoint) throws Throwable { + startTime.set(System.currentTimeMillis()); + + ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); + if (attributes == null) return; + HttpServletRequest request = attributes.getRequest(); + + // 获取方法参数 + MethodSignature signature = (MethodSignature) joinPoint.getSignature(); + Method method = signature.getMethod(); + Object[] args = joinPoint.getArgs(); + Annotation[][] annotations = method.getParameterAnnotations(); + + Map params = new HashMap<>(); + for (int i = 0; i < annotations.length; i++) { + for (Annotation annotation : annotations[i]) { + if (annotation instanceof RequestParam requestParam) { + params.put(requestParam.value(), args[i]); + } else if (annotation instanceof RequestBody) { + params.put("body", args[i]); + } + } + } + + logger.info("请求开始:{} {}", request.getMethod(), request.getRequestURI()); + logger.info("调用方法:{}.{}", joinPoint.getSignature().getDeclaringTypeName(), joinPoint.getSignature().getName()); + logger.info("请求参数:{}", objectMapper.writeValueAsString(params)); + } + + @AfterReturning(pointcut = "webLog()", returning = "ret") + public void doAfterReturning(Object ret) throws Throwable { + long elapsed = System.currentTimeMillis() - startTime.get(); + logger.info("请求结束,耗时:{}ms", elapsed); + startTime.remove(); + } +} diff --git a/src/main/resources/logback.xml b/src/main/resources/logback.xml new file mode 100644 index 0000000..ec8f5f7 --- /dev/null +++ b/src/main/resources/logback.xml @@ -0,0 +1,27 @@ + + + + + + + + + %d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger - %msg%n + + + + + + ${LOG_PATH}/${APP_NAME}.log + true + + %d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger - %msg%n + + + + + + + + +