Files
Frobot-OTA-Server/src/main/java/com/noblelift/ota/common/aspect/LogAspect.java
2026-04-23 14:23:42 +08:00

62 lines
2.7 KiB
Java

package com.noblelift.ota.common.aspect;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.noblelift.ota.common.annotation.Log;
import jakarta.servlet.http.HttpServletRequest;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import java.util.Arrays;
@Aspect
@Component
@Slf4j
@RequiredArgsConstructor
public class LogAspect {
private final ObjectMapper objectMapper;
@Around("@annotation(logAnnotation)")
public Object around(ProceedingJoinPoint joinPoint, Log logAnnotation) throws Throwable {
long start = System.currentTimeMillis();
MethodSignature signature = (MethodSignature) joinPoint.getSignature();
RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
HttpServletRequest request = requestAttributes instanceof ServletRequestAttributes servletRequestAttributes
? servletRequestAttributes.getRequest()
: null;
String requestUri = request == null ? "N/A" : request.getRequestURI();
String requestMethod = request == null ? "N/A" : request.getMethod();
String params = serializeArgs(joinPoint.getArgs());
String operation = logAnnotation.value().isBlank() ? signature.getMethod().getName() : logAnnotation.value();
log.info("[API-REQUEST] operation={}, method={}, uri={}, params={}", operation, requestMethod, requestUri, params);
try {
Object result = joinPoint.proceed();
log.info("[API-RESPONSE] operation={}, duration={}ms", operation, System.currentTimeMillis() - start);
return result;
} catch (Throwable ex) {
log.error("[API-ERROR] operation={}, duration={}ms, message={}", operation, System.currentTimeMillis() - start, ex.getMessage(), ex);
throw ex;
}
}
private String serializeArgs(Object[] args) {
Object[] filtered = Arrays.stream(args)
.filter(arg -> !(arg instanceof HttpServletRequest))
.toArray();
try {
return objectMapper.writeValueAsString(filtered);
} catch (JsonProcessingException e) {
return Arrays.toString(filtered);
}
}
}