使用AOP和注解动态打印日志
主要打印类名、方法名、请求url、入参以及花费时间
@Component
@Aspect
@Slf4j
@RequiredArgsConstructor
public class LogAspect {
private final ObjectMapper objectMapper;
@Pointcut("@annotation(com.iot.cpe.common.MyLog)")
public void aspect() {
}
@Around("aspect()")
public Object around(ProceedingJoinPoint joinPoint) throws Throwable {
long start = System.currentTimeMillis();
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
assert attributes != null;
HttpServletRequest request = attributes.getRequest();
Signature signature = joinPoint.getSignature();
//类名
String typeName = signature.getDeclaringType().getSimpleName();
//方法名
String methodName = signature.getName();
//请求url
String url = request.getRequestURI();
//入参列表
String[] paramNames = ((MethodSignature) signature).getParameterNames();
Object[] paramValues = joinPoint.getArgs();
StringBuilder requestLog = new StringBuilder();
requestLog.append("【").append(typeName).append("-").append(methodName).append("】 URL:").append(url).append(", Param:{");
int paramLength = null == paramNames ? 0 : paramNames.length;
if (paramLength != 0) {
for (int i = 0; i < paramLength - 1; i++) {
requestLog.append(paramNames[i]).append("=").append(objectMapper.writeValueAsString(paramValues[i])).append(", ");
}
requestLog.append(paramNames[paramLength - 1]).append("=").append(objectMapper.writeValueAsString(paramValues[paramLength - 1])).append("}");
}
log.info(requestLog.toString());
Object proceed = joinPoint.proceed();
long end = System.currentTimeMillis();
//打印花费时间
log.info("【{}-{}】 spend time:{}ms", typeName, methodName, end - start);
return proceed;
}
}