springboot-aop日志打印

package com.cinc.ecmp.client;

import com.cinc.ecmp.enums.BackResultEnum;
import com.cinc.ecmp.exception.BasException;
import com.cinc.ecmp.utils.JsonUtil;
import com.cinc.ecmp.vo.BackResult;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
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;

/**
 * @Author: hhr
 * @Despriction:  调用其他服务的日志打印
 * @CreatedTime: 2019/8/13 14:01
 * @ModifyBy:
 * @ModifyTime:
 * @ModifyDespriction:
 * @Version: V1.0.0
 */
@Slf4j
@Component
@Aspect
public class ClientLogRecordAspect {

    private final String pointCutStr = "execution(* com.cinc.ecmp.client..*.*(..))";

    /**
     * 定义切点
     */
    @Pointcut(pointCutStr)
    public void executeService(){

    }

    @Before("executeService()")
    public void doBefore(JoinPoint point) throws Throwable{

        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        HttpServletRequest request = attributes.getRequest();

        //从切面织入点处通过反射机制获取织入点处的方法
        MethodSignature signature = (MethodSignature) point.getSignature();
        String declar = signature.getName();
        //获取切入点所在的方法
        Method method = signature.getMethod();
        log.info("============ 请求{}/{}开始 start:============",request.getRequestURI(),declar);

        //获取请求的类名
        String className = point.getTarget().getClass().getName();
        //获取请求的方法名
        String methodName = method.getName();
        //请求的参数
        Object[] args = point.getArgs();
        //将参数所在的数组转换成json
        String params = JsonUtil.objectToJsonStr(args);

        log.info("{} 参数params:{}", declar,params);

    }


    @AfterReturning(value = pointCutStr,returning = "resultInfo")
    public void doAfterReturn(JoinPoint point,Object resultInfo) throws Throwable{

        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        HttpServletRequest request = attributes.getRequest();

        //从切面织入点处通过反射机制获取织入点处的方法
        MethodSignature signature = (MethodSignature) point.getSignature();
        String declar = signature.getName();
        //获取切入点所在的方法
        Method method = signature.getMethod();

        log.info("{}返回参数params:{}",declar, JsonUtil.objectToJsonStr(resultInfo));

        BackResult backResult = (BackResult)resultInfo;

        if (null == backResult || !BackResultEnum.SUCCESS.getCode().equals(backResult.getCode())){
            throw new BasException("ERROR","调用" + declar + "失败");
        }

        log.info("============ 请求{}/{}结束 end ============" , request.getRequestURI(),declar);
    }


}

  

posted @ 2019-08-16 08:49  丿少女梦丶  阅读(162)  评论(0编辑  收藏  举报