Files
kelfy-datamanager/src/main/java/com/joju/datamanager/common/elegancelog/EleganceLogAspect.java
2024-04-07 11:28:44 +08:00

153 lines
5.2 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package com.joju.datamanager.common.elegancelog;
import cn.hutool.json.JSONUtil;
import com.joju.datamanager.common.annotation.EleganceLog;
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;
/**
* Created with IntelliJ IDEA.
*
* @author Mr.zs
* @date 2023/12/27
* @description
* @modifiedBy
* @version: 1.0
*/
@Aspect
@Component
public class EleganceLogAspect {
private final static Logger logger = LoggerFactory.getLogger(EleganceLogAspect.class);
/**
* 换行符
*/
private static final String LINE_SEPARATOR = System.lineSeparator();
/**
* 以自定义 @WebLog 注解为切点
*/
@Pointcut("@annotation(com.joju.datamanager.common.annotation.EleganceLog)")
public void EleganceLog() {
}
/**
* 在切点之前织入
*
* @param joinPoint
* @throws Throwable
*/
@Before("EleganceLog()")
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());
// 打印请求入参
if (methodDescription.equals("loginUserInfo") || methodDescription.equals("quitUserInfo")) {
} else {
logger.info("Request Args : {}", JSONUtil.toJsonStr(joinPoint.getArgs()));
}
}
/**
* 环绕
*
* @param proceedingJoinPoint
* @return
* @throws Throwable
*/
@Around("EleganceLog()")
public Object doAround(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
long startTime = System.currentTimeMillis();
Object result = proceedingJoinPoint.proceed();
// 打印出参
logger.info("Response Args : {}", JSONUtil.toJsonStr(result));
// 执行耗时
logger.info("Time-Consuming : {} ms", System.currentTimeMillis() - startTime);
logger.info("=========================================== End ===========================================" + LINE_SEPARATOR);
return result;
}
/**
* 在切点之后织入
*
* @throws Throwable
*/
// @After("EleganceLog()")
// public void doAfter() throws Throwable {
// // 接口结束后换行,方便分割查看
// logger.info("=========================================== End ===========================================" + LINE_SEPARATOR);
// }
// @AfterReturning("EleganceLog()")
// public void afterRunning() throws Throwable {
// // 接口结束后换行,方便分割查看
// logger.info("=========================================== End ===========================================" + LINE_SEPARATOR);
// }
@AfterThrowing("EleganceLog()")
public void afterThrowing() {
// System.out.println("异常出现之后...afterThrowing");
logger.info("=========================================== Exception Start===========================================" + LINE_SEPARATOR);
}
/**
* 获取切面注解的描述
*
* @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(EleganceLog.class).description());
break;
}
}
}
return description.toString();
}
}