打印日志
package com.dst.mid.common.aop.apilog;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.date.TimeInterval;
import cn.hutool.json.JSONUtil;
import com.dst.mid.common.entities.result.PageInfoPlusResult;
import com.dst.mid.common.entities.result.PageInfoResult;
import com.dst.mid.common.entities.result.Results;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
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;
/**
* @description: 日志切面
* @author: wujieye
* @date: 2022/3/10 17:47
*/
@Aspect
@Component
@Slf4j
//@Profile({"dev", "test", "prod"})
public class WebLogAspect {
/**
* 换行符
*/
private static final String LINE_SEPARATOR = System.lineSeparator();
/**
* 以自定义 @WebLog 注解为切点
*/
@Pointcut("execution(public * com.dst..modules.business..*Controller.*(..))")
public void webLog() {
}
/**
* 在切点之前织入
*
* @param joinPoint
* @throws Throwable
*/
@Before("webLog()")
public void doBefore(JoinPoint joinPoint) throws Throwable {
// 开始打印请求日志
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequest request = attributes.getRequest();
//
boolean printLog = isPrintLog(joinPoint);
if (!printLog) {
return;
}
String logInfo = new StringBuilder().append("外部服务调用请求:request===>").append(LINE_SEPARATOR)
.append("请求路径url:").append(request.getMethod()+" ").append(request.getRequestURL().toString()).append(" HTTP/1.1").append(LINE_SEPARATOR)
.append("请求方法method:").append(joinPoint.getSignature().getDeclaringTypeName()).append("#").append(joinPoint.getSignature().getName()).append(LINE_SEPARATOR)
.append("请求IP:").append(request.getRemoteAddr()).append(LINE_SEPARATOR)
.append("请求入参:").append(JSONUtil.toJsonStr(joinPoint.getArgs())).append(LINE_SEPARATOR).toString();
// 打印请求相关参数、
log.info(logInfo);
}
/**
* 在切点之后织入
*
* @throws Throwable
*/
@After("webLog()")
public void doAfter() throws Throwable {
// 接口结束后换行,方便分割查看
log.info("<===End");
}
/**
* 环绕
*
* @param proceedingJoinPoint
* @return
* @throws Throwable
*/
@Around("webLog()")
public Object doAround(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
TimeInterval timer = DateUtil.timer();
Object result = proceedingJoinPoint.proceed();
StringBuilder logStr = new StringBuilder().append("外部服务调用响应:response===>").append(LINE_SEPARATOR)
.append("请求方法method:").append(proceedingJoinPoint.getSignature().getDeclaringTypeName()).append("#").append(proceedingJoinPoint.getSignature().getName()).append(LINE_SEPARATOR);
if(result instanceof Results) {
//如果是返回值是分页对象,不打印响应数据。
if (!(((Results<?>) result).getData() instanceof PageInfoPlusResult) && !(((Results<?>) result).getData() instanceof PageInfoResult)) {
logStr.append("响应数据:").append(JSONUtil.toJsonStr(result)).append(LINE_SEPARATOR);
}
}
logStr.append("响应时间elapsedTime:").append(timer.intervalPretty()).append(LINE_SEPARATOR);
log.info(logStr.toString());
return result;
}
/**
* 检查该方法是否需要打印日志
*
* @param joinPoint 切点
* @return true 需要打印日志,false 不需要打印日志
* @throws Exception
*/
public boolean isPrintLog(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();
boolean flag = true;
for (Method method : methods) {
if (method.getName().equals(methodName)) {
Class[] clazzs = method.getParameterTypes();
if (clazzs.length == arguments.length) {
NotPrintLog annotation = method.getAnnotation(NotPrintLog.class);
if (annotation != null) {
return false;
}
}
}
}
return flag;
}
}