This commit is contained in:
huababa1
2025-07-03 15:22:22 +08:00
2 changed files with 97 additions and 0 deletions

View File

@@ -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<Long> 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<String, Object> 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();
}
}

View File

@@ -0,0 +1,27 @@
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<property name="LOG_PATH" value="logs"/>
<property name="APP_NAME" value="log"/>
<!-- 控制台输出 -->
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger - %msg%n</pattern>
</encoder>
</appender>
<!-- 写入固定日志文件 -->
<appender name="file" class="ch.qos.logback.core.FileAppender">
<file>${LOG_PATH}/${APP_NAME}.log</file>
<append>true</append> <!-- 追加写入 -->
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger - %msg%n</pattern>
</encoder>
</appender>
<!-- 根日志级别 -->
<root level="INFO">
<appender-ref ref="console"/>
<appender-ref ref="file"/>
</root>
</configuration>