• 接口日志记录AOP实现-LogAspect


    使用spring aop日志记录

    所需jar包

    pom.xml

        <!-- logger begin -->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.7.5</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>jcl-over-slf4j</artifactId>
            <version>1.7.5</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>1.7.5</version>
        </dependency>
        <!-- logger end -->

    LogAspect.java

    package isa.qa.frame.common;
    
    import java.text.SimpleDateFormat;
    import java.util.Arrays;
    import java.util.HashMap;
    import java.util.Map;
    
    import javax.servlet.http.HttpServletRequest;
    
    import org.aspectj.lang.JoinPoint;
    import org.aspectj.lang.ProceedingJoinPoint;
    import org.aspectj.lang.annotation.After;
    import org.aspectj.lang.annotation.Around;
    import org.aspectj.lang.annotation.Aspect;
    import org.aspectj.lang.annotation.Before;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.web.context.request.RequestAttributes;
    import org.springframework.web.context.request.RequestContextHolder;
    import org.springframework.web.context.request.ServletRequestAttributes;
    
    import com.google.gson.Gson;
    
    /**
     * 
    * @ClassName: LogAspect 
    * @Description: 日志记录AOP实现 
    * @author shaojian.yu
    * @date 2014年11月3日 下午1:51:59 
    *
     */
    @Aspect
    public class LogAspect {
        private final Logger logger = LoggerFactory.getLogger(this.getClass());
    
        private String requestPath = null ; // 请求地址
        private String args = null; //方法里的参数
        private Map<?,?> inputParamMap = null ; // 传入参数
        private Map<String, Object> outputParamMap = null; // 存放输出结果
        private long startTimeMillis = 0; // 开始时间
        private long endTimeMillis = 0; // 结束时间
    
        /**
         * 
         * @Title:doBeforeInServiceLayer
         * @Description: 方法调用前触发 
         *  记录开始时间 
         * @author shaojian.yu 
         * @date 2014年11月2日 下午4:45:53
         * @param joinPoint
         */
        @Before("execution(* isa.qa..*.controller..*.*(..))")
        public void doBeforeInServiceLayer(JoinPoint joinPoint) {
            startTimeMillis = System.currentTimeMillis(); // 记录方法开始执行的时间
        }
    
        /**
         * 
         * @Title:doAfterInServiceLayer
         * @Description: 方法调用后触发 
         *  记录结束时间
         * @author shaojian.yu 
         * @date 2014年11月2日 下午4:46:21
         * @param joinPoint
         */
        @After("execution(* isa.qa..*.controller..*.*(..))")
        public void doAfterInServiceLayer(JoinPoint joinPoint) {
            endTimeMillis = System.currentTimeMillis(); // 记录方法执行完成的时间
            this.printOptLog();
        }
    
        /**
         * 
         * @Title:doAround
         * @Description: 环绕触发 
         * @author shaojian.yu 
         * @date 2014年11月3日 下午1:58:45
         * @param pjp
         * @return
         * @throws Throwable
         */
        @Around("execution(* isa.qa..*.controller..*.*(..))")
        public Object doAround(ProceedingJoinPoint pjp) throws Throwable {
            /**
             * 1.获取request信息
             * 2.根据request获取session
             * 3.从session中取出登录用户信息
             */
            RequestAttributes ra = RequestContextHolder.getRequestAttributes();
            ServletRequestAttributes sra = (ServletRequestAttributes)ra;
            HttpServletRequest request = sra.getRequest();
            // 从session中获取用户信息
           /* String loginInfo = (String) session.getAttribute("username");
            if(loginInfo != null && !"".equals(loginInfo)){
                userName = operLoginModel.getLogin_Name();
            }else{
                userName = "用户未登录" ;
            }*/
            // 获取输入参数
            inputParamMap = request.getParameterMap();
            // 获取请求地址
            requestPath = request.getRequestURI();
            
            args = Arrays.toString(pjp.getArgs());
            
            // 执行完方法的返回值:调用proceed()方法,就会触发切入点方法执行
            outputParamMap = new HashMap<String, Object>();
            Object result = pjp.proceed();// result的值就是被拦截方法的返回值
            outputParamMap.put("result", result);
            
            return result;
        }
    
        /**
         * 
         * @Title:printOptLog
         * @Description: 输出日志 
         * @author shaojian.yu 
         * @date 2014年11月2日 下午4:47:09
         */
        private void printOptLog() {
            Gson gson = new Gson(); // 需要用到google的gson解析包
            String optTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(startTimeMillis);
            logger.info(//"
     user:"+userName+
                    "
    "
                    +"
     url:"+requestPath
                    +"
     args:"+args
                    +"
     param:"+gson.toJson(inputParamMap)+";"
                    +"
     result:"+gson.toJson(outputParamMap)
                    +"
    ");
        }
    }

    注意 "execution(* isa.qa..*.controller..*.*(..))" 里的配置需要根据自己实际项目配置路径

    springMVC配置文件中:spring-servlet.xml

        <aop:aspectj-autoproxy proxy-target-class="true"/>  
        <bean class="isa.qa.frame.common.LogAspect" />

    最后启动服务,调用服务端接口,如果控制台输出形式为:

    url:xxx
    args:xxx
    param:xxx
    result:xxx

    则aop日志记录正确。。。

  • 相关阅读:
    《css世界》学习摘要
    微信小程序知识点积累
    事件冒泡 事件委派
    遍历后台返回数据
    初识open stack
    keystone初识
    KVM详解
    openstack详解
    NoSQL之Redis集群理论
    gfs分布式文件系统
  • 原文地址:https://www.cnblogs.com/007sx/p/5810818.html
Copyright © 2020-2023  润新知