package com.chinamoblie.cmss.vrms.rsiserver.config.advice;
import cn.hutool.core.util.StrUtil;
import com.chinamoblie.cmss.vrms.rsiserver.config.advice.annotations.ControllerLog;
import com.chinamoblie.cmss.vrms.rsiserver.config.advice.annotations.ServiceLog;
import com.chinamoblie.cmss.vrms.rsiserver.entity.ResLog;
import com.chinamoblie.cmss.vrms.rsiserver.service.IResLogService;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.extern.log4j.Log4j2;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.lang.reflect.Method;
/**
* @author AbbottLiu
* @Date 2019/10/28
* @Description
*/
@Aspect
@Log4j2
@Component
public class LogAdvice {
/**
* controller 层切入点
**/
@Pointcut("@annotation(com.chinamoblie.cmss.vrms.rsiserver.config.advice.annotations.ControllerLog)")
public void controllerCut() {
}
/**
* service 层切入点
**/
@Pointcut("@annotation(com.chinamoblie.cmss.vrms.rsiserver.config.advice.annotations.ServiceLog)")
public void serviceCut() {
}
@Autowired
IResLogService resLogService;
@Autowired
ObjectMapper objectMapper;
// @Before("execution(* com.chinamoblie.cmss.vrms.rsiserver.controller.ResDataManagementController.getData(..) )")
@Before("controllerCut()")
public void breforeControllerLog(JoinPoint joinPoint) throws Exception {
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
String username=request.getHeader("username");
//获取用户请求方法的参数并序列化为JSON格式字符串
String params = "";
if (joinPoint.getArgs() != null && joinPoint.getArgs().length > 0) {
for (int i = 0; i < joinPoint.getArgs().length; i++) {
// params += objectMapper.writeValueAsString(objectMapper.writeValueAsString(joinPoint.getArgs()[i])) + ";";
}
}
log.info("=====前置通知开始=====");
log.info("请求方法:" + (joinPoint.getTarget().getClass().getName() + "." + joinPoint.getSignature().getName() + "()"));
log.info("方法描述:" + getControllerMethodDescription(joinPoint));
String targetName = joinPoint.getTarget().getClass().getName();
for (int i = 0; i < joinPoint.getArgs().length; i++) {
log.info(joinPoint.getArgs()[i]);
}
log.info(targetName);
// log.info(request.getRequestURI());
log.info(joinPoint.getSignature());
log.info(joinPoint.getSignature().getName());
log.info(joinPoint.getKind());
log.info(joinPoint.getSourceLocation());
log.info(joinPoint.getStaticPart());
ResLog resLog = new ResLog();
resLog.setIpAddress(request.getRemoteHost());
// logRecordObj.set
resLog.setResclasscnname("1111");
if(StrUtil.isNotBlank(username)){
resLog.setUserName(username);
}
/** 异步保存日志 **/
resLogService.syncInsert(resLog);
}
/**
* 获取注解中对方法的描述信息 用于service层注解
*
* @param joinPoint 切点
* @return 方法描述
* @throws Exception
*/
public static String getServiceMthodDescription(JoinPoint joinPoint) throws ClassNotFoundException {
String targetName = joinPoint.getTarget().getClass().getName();
String methodName = joinPoint.getSignature().getName();
Object[] arguments = joinPoint.getArgs();
Class targetClass = Class.forName(targetName);
Method[] methods = targetClass.getMethods();
String description = "";
for (Method method : methods) {
if (method.getName().equals(methodName)) {
Class[] clazzs = method.getParameterTypes();
if (clazzs.length == arguments.length) {
description = method.getAnnotation(ServiceLog.class).value();
break;
}
}
}
return description;
}
/**
* 获取注解中对方法的描述信息 用于Controller层注解
*
* @param joinPoint 切点
* @return 方法描述
* @throws Exception
*/
public static String getControllerMethodDescription(JoinPoint joinPoint) throws ClassNotFoundException {
String targetName = joinPoint.getTarget().getClass().getName();
String methodName = joinPoint.getSignature().getName();
Object[] arguments = joinPoint.getArgs();
Class targetClass = Class.forName(targetName);
Method[] methods = targetClass.getMethods();
String description = "";
for (Method method : methods) {
if (method.getName().equals(methodName)) {
Class[] clazzs = method.getParameterTypes();
if (clazzs.length == arguments.length) {
description = method.getAnnotation(ControllerLog.class).value();
break;
}
}
}
return description;
}
}
AOP请求日志存储
最新推荐文章于 2022-04-21 14:04:32 发布