spring bootによるcontrolerログの切断処理

45785 ワード

spring bootによるcontrolerログの切断処理
問題の需要:プロジェクトにはログにインターフェースの着信値を記録する必要があります.インターフェースはipを呼び出して、インターフェースは時間を呼び出して、そして入庫します.
処理方式:controller層に断面処理を加える.
1.必要なカバン、springbootのaopカット面、二つのツール類、huotoolとjackson pomは以下の通りです.
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-aop</artifactId>
        </dependency>
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-core</artifactId>
            <version>4.5.18</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-annotations</artifactId>
            <version>2.9.0</version>
        </dependency>
2.コード作成:
/**
 * 
*
ControllerAspect
*
Description:
*
Copyright: Copyright (C) 2019
*
Company:
*
CreateDate: 2019/7/26
*
* * @author hht */
@Component @Aspect public class ControllerAspect { private Logger logger = LoggerFactory.getLogger(ControllerAspect.class); // Pointcut @Pointcut( "execution(* com.test.test.controller..*(..))") public void executeController() { } @Before("executeController()") public void before(JoinPoint joinPoint) throws Exception{ RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes(); ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes) requestAttributes; HttpServletRequest request = servletRequestAttributes.getRequest(); // Method m = ((MethodSignature) joinPoint.getSignature()).getMethod(); // , if (joinPoint.getThis().getClass() != joinPoint.getTarget().getClass()) { m = ReflectUtil.getMethod(joinPoint.getTarget().getClass(), m.getName(), m.getParameterTypes()); } // LocalVariableTableParameterNameDiscoverer paramNames = new LocalVariableTableParameterNameDiscoverer(); String[] parameterNames = paramNames.getParameterNames(m); // Object[] args = joinPoint.getArgs(); // Map<String, Object> params = new HashMap<>(); // if (!TextUtil.isEmpty(parameterNames)){ for (int i = 0; i < parameterNames.length; i++) { // , requestParam , require=false, if (TextUtil.isEmpty(args[i])){ continue; } // , , ObjectMapper objectMapper = new ObjectMapper(); objectMapper.convertValue(args[i],args[i].getClass()); params.put(parameterNames[i],JSON.toJSON(objectMapper.convertValue(args[i],args[i].getClass()))); } } logger.info("before start:-------------------------------"); logger.info("URL : " + request.getRequestURL().toString()); logger.info("HTTP_METHOD : " + request.getMethod()); logger.info("IP : " + request.getRemoteAddr()); logger.info("CLASS_METHOD : " + joinPoint.getSignature().getDeclaringTypeName()+ "." + joinPoint.getSignature().getName()); // , logger.info("ARGS-JSON : " + params); // , logger.info("ARGS : "+ Arrays.toString(joinPoint.getArgs())); logger.info("before end:-------------------------------"); } @AfterReturning(value = "executeController()",returning = "rtv") public void after(JoinPoint joinPoint, Object rtv){ logger.info("before return+++++++++++++++++++++++++++"); logger.info("responseBody:"+JSON.toJSONString(rtv,SerializerFeature.WriteMapNullValue)); logger.info("end return++++++++++++++++++++++++++++++++"); } }
以上は点を切って改正して直接使うことができるのでさえすれば、更に直観的なのは日誌のデータを見ることができて、正しくて、異常な処理のうどんをプラスしていません.
aopサラウンドを利用して、うどん呼び出しデータ入庫処理を行う.
直接コード
public class ControllerAspect {

    @Autowired
    AsyncTask asyncTask;

    private Logger logger = LoggerFactory.getLogger(ControllerAspect.class);

    //     Pointcut
    @Pointcut( "execution(* com.test.web..*.*(..))")
    public void executeController() {
    }

    @Before("executeController()")
    public void before(JoinPoint joinPoint) throws Exception{
        RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
        ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes) requestAttributes;
        HttpServletRequest request = servletRequestAttributes.getRequest();
        logger.info("before start:-------------------------------");
        logger.info("URL : " + request.getRequestURL().toString());
        logger.info("HTTP_METHOD : " + request.getMethod());
        logger.info("IP : " + request.getRemoteAddr());
        logger.info("CLASS_METHOD : " + joinPoint.getSignature().getDeclaringTypeName()+ "." + joinPoint.getSignature().getName());
        logger.info("ARGS-JSON : " + CommonAop.getAopParam(joinPoint));
        logger.info("ARGS : "+ Arrays.toString(joinPoint.getArgs()));
        logger.info("before end:-------------------------------");
    }
    /**
     *         
    */
    @Around("executeController()")
    public Object around(ProceedingJoinPoint pjp) throws Throwable {
    	//  !!!!!  pjp.proceed()         ,      ,             ,  hasnext() next()
        Object object = pjp.proceed();
        try {
            //        
            RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
            ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes) requestAttributes;
            HttpServletRequest request = servletRequestAttributes.getRequest();
            //    ,           ,      
            //CommonAop.getAopParam(pjp)    ,        ProceedingJoinPoint JoinPoint    
            asyncTask.doInsertLog(request.getRequestURL().toString(),request.getRemoteAddr(), JSON.toJSONString(CommonAop.getAopParam(pjp),SerializerFeature.WriteMapNullValue),request.getMethod(),JSON.toJSONString(object,SerializerFeature.WriteMapNullValue));
        }catch (Exception e){
            e.printStackTrace();
        }
        return object;
    }


    @AfterReturning(value = "executeController()",returning = "rtv")
    public void after(JoinPoint joinPoint, Object rtv){
        logger.info("before return+++++++++++++++++++++++++++");
        logger.info("responseBody:"+JSON.toJSONString(rtv,SerializerFeature.WriteMapNullValue));
        logger.info("end return++++++++++++++++++++++++++++++++");
    }



}

Common Aop

public class CommonAop {

    public static Map<String,Object> getAopParam(JoinPoint joinPoint){
        //                          
        Method m = ((MethodSignature) joinPoint.getSignature()).getMethod();
        //                     ,                  
        if (joinPoint.getThis().getClass() != joinPoint.getTarget().getClass()) {
            m = ReflectUtil.getMethod(joinPoint.getTarget().getClass(), m.getName(), m.getParameterTypes());
        }
        //               
        Object[] args = joinPoint.getArgs();
        return CommonAop.getParam(m,args);
    }

    public static Map<String,Object> getParam(Method m,Object[] args){
        //                
        LocalVariableTableParameterNameDiscoverer paramNames = new LocalVariableTableParameterNameDiscoverer();
        String[] parameterNames = paramNames.getParameterNames(m);

        //               
        Map<String, Object> params = new HashMap<>();
        if (!TextUtil.isEmpty(parameterNames)){
            for (int i = 0; i < parameterNames.length; i++) {
                if (TextUtil.isEmpty(args[i])){
                    continue;
                }
                //       ,   ,          
                ObjectMapper objectMapper = new ObjectMapper();
                objectMapper.convertValue(args[i],args[i].getClass());
                params.put(parameterNames[i], JSON.toJSON(objectMapper.convertValue(args[i],args[i].getClass())));
            }
        }
        return params;
    }


}