您的位置:首页 > 编程语言 > Java开发

利用注解式切面单独打印接口调用日志

2018-03-22 09:13 531 查看
背景:我们可能希望对项目中的接口性能进行监控,例如:接口调用时间,开始时间,结束时间,传入的参数等等,通常的做法是在接口代码开始处记录startTime,结尾处记录endTime,然后计算startTime和endTime之差,这种做法无法把这部分日志单独拆分成文件,而且冗余代码会比较多。可以考虑使用spring切面和环绕通知来打印这部分日志,并使用log4j2将这部分日志单独拆分出来。
ps:拆分的出来的日志可以考虑使用shell脚本和awk命令来进行日志分析,将一些关键的数据存库,然后使用echarts来分析来展示图表,就可以成为一个小型的接口监控系统,使用linux的crontab来定时执行脚本,每天刷新数据。

技术点:spring 注解式切面和环绕通知

使用的项目:工作流、规则引擎

具体实现(以规则引擎为例):
1.在rpc-impl层新增PerformenceMonitor类(名字可以随便起)
package com.yixin.ndss.common.aop;

import java.text.SimpleDateFormat;

import java.util.Date;

import org.apache.logging.log4j.Level;

import org.apache.logging.log4j.LogManager;

import org.apache.logging.log4j.Logger;

import org.aspectj.lang.ProceedingJoinPoint;

import org.aspectj.lang.annotation.Around;

import org.aspectj.lang.annotation.Aspect;

import org.aspectj.lang.annotation.Pointcut;

import org.springframework.stereotype.Component;

import com.yixin.common.utils.JsonObjectUtils;

/**

* 监控方法的执行时间



* <p>



* Package : com.yixin.common.system.ioc



* @author YixinCapital -- shaoml

*                   2016年10月20日 下午6:55:45

*

*/

@Aspect  

@Component

public class PerformenceMonitor {

        

        private static final Logger LOGGER = LogManager.getLogger(PerformenceMonitor.class);

        

        /**

         * 切点监控com.yixin.wfpt.api.process.impl包的所有public方法  

         *  

         * @author YixinCapital -- shaoml

         *               2017年4月26日 上午9:55:31

         */

    @Pointcut("execution(* com.yixin.ndss.application.api.impl..*(..))")    

    private void pointCutMethod() {

            

    }    

  

    /**

     * 声明环绕通知

     * 

     * @param pjp 代理对象

     * @return Object 方法调用出参

     * @throws Throwable 

     * @author YixinCapital -- shaoml

     *               2017年4月26日 上午9:55:16

     */

    @Around("pointCutMethod()")    

    public Object doAround(ProceedingJoinPoint pjp) throws Throwable {

            

            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

            

        // 执行方法开始时间

            long begin = System.currentTimeMillis();

        String beginStr = sdf.format(new Date(begin));

        

        Object obj = pjp.proceed();

        

        // 入参拦截

        Object[] args = pjp.getArgs();

        

        // 执行方法结束时间

        long end = System.currentTimeMillis();

        String endStr = sdf.format(new Date(end));

        

        LOGGER.log(Level.forName("CAP", 460),

                        "======调用" + pjp.getTarget().getClass().getSimpleName()

                        + "类中方法: " + pjp.getSignature().getName()

                        + "(), 开始时间: " + beginStr + ", 结束时间: " + endStr + ", 总耗时: " + (end - begin) + "ms,"

                        + "入参=【" + JsonObjectUtils.objectToJson(args) + "】, 出参=【" + JsonObjectUtils.objectToJson(obj) + "】");

        

        return obj;    

    }

    

}
复制代码
2.spring-context xml文件中新增aspectJ自动代理和aop的引用
  
复制代码

 

3.配置异步日志:
在log4j2.xml文件中进行如下配置:


 


 2.png (30.13 KB, 下载次数: 0)下载附件2017-7-25 16:25 上传


 

4.本地启动项目,postman调用哪个接口测试:


 


 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java spring aop