package cn.cslg.pas.common.core.annotation;


import cn.cslg.pas.common.utils.JsonUtils;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;

@Order(3)
@Aspect
@Component
@Slf4j
public class LoggerAspect {


    /**
     * 定义切点
     */
    @Pointcut("execution( * cn.cslg.pas.controller..*.*(..))")
    public void annotationPointcut() {

    }

    /**
     * @param joinPoint 当前执行的方法
     */
    @Around("annotationPointcut()")
    public Object doAround(ProceedingJoinPoint joinPoint) throws Throwable {

        //判断通过
        return joinPoint.proceed();
    }

    @AfterThrowing(pointcut = "annotationPointcut()",throwing = "e")
    public void doAfterThrowing(JoinPoint joinPoint, Throwable e){

        //获取用户请求方法的参数并序列化为JSON格式字符串
        String params = "";
        if (joinPoint.getArgs()!=null&&joinPoint.getArgs().length>0){
            for (int i = 0; i < joinPoint.getArgs().length; i++) {
                params+= JsonUtils.objectToJson(joinPoint.getArgs()[i])+";";
            }
        }
        try{
            String str1 ="异常代码:" + e.getClass().getName();
            String str2 ="异常信息:" + e.getMessage();
            String str3="异常方法:" + (joinPoint.getTarget().getClass().getName() + "." + joinPoint.getSignature().getName() + "()");
            String str4="请求参数:" + params; System.out.println("异常代码:" + e.getClass().getName());
   log.error(str1+"\r"+str2+"\r"+str3+"\r"+str4);
        }catch (Exception ex){
            //记录本地异常日志
            log.error("==异常通知异常==");
            log.error("异常信息:{}", ex.getMessage());
        }
    }

}

