接口日志記錄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(//"\n user:"+userName+
                "\n"
                +"\n url:"+requestPath
                +"\n args:"+args
                +"\n param:"+gson.toJson(inputParamMap)+";"
                +"\n result:"+gson.toJson(outputParamMap)
                +"\n");
    }
}

注意 "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日志記錄正確。。。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM