1. 程式人生 > >SpringBoot通過AOP實現系統日誌記錄(三)-Mapper層日誌監控及自定義異常攔截

SpringBoot通過AOP實現系統日誌記錄(三)-Mapper層日誌監控及自定義異常攔截

本文是SpringBoot通過AOP實現系統日誌記錄(三)-Mapper層日誌監控及異常攔截,若要實現Service層監控,請點選傳送門:

SpringBoot通過AOP實現系統日誌記錄(二)-Service層日誌監控

由於公司業務上的需求,現在需要對整個系統做日誌效能監控,方便開發人員快速定位系統瓶頸並方便開發人員去解決問題,相關程式碼如下:

1、引入依賴

<!-- 引入aop-->
<dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-aop</artifactId>
</dependency>

2、MapperMonitor監控註解

/**
 * @Description: Mapper監控註解
 * @Author: zhangzhixiang
 * @CreateDate: 2018/12/09 12:34:56
 * @Version 1.0
 */
@Documented
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface MapperMonitor {
    String value() default "";
}

3、Mapper層程式碼

/**
 * @Description:業務Mapper介面
 * @Author:zhangzhixiang
 * @Date:2018/09/08 19:56:31
 */
public interface BusinessDAO {

    /**
     * 根據條件查詢業務資料
     *
     * @param businessBO
     * @return List
     * @author zhangzhixiang
     * @date 2018/09/29 11:49:56
     */
    @MapperMonitor
    List<BusinessDO> selectByCondition(BusinessDO businessDO) throws Exception;

}

4、Mapper層日誌監控及異常攔截

/**
 * @Description:Mapper層異常攔截器
 * @Author:zhangzhixiang
 * @CreateDate:2018/11/08 11:19:56
 * @Version:1.0
 */
@Aspect
@Component
public class MapperLogAspect {

    private SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-mm-dd HH:mm:ss");
    
    private final Logger logger = LoggerFactory.getLogger(this.getClass());

    @Pointcut("execution(public * com.cy.ops.*.dal..*(..))")
    public void mapperLog() {}

    @Around(value = "mapperLog()")
    public Object doAround(ProceedingJoinPoint joinPoint) throws Throwable {
        //1、記錄執行時間
        long startTime = System.currentTimeMillis();
        Object result = joinPoint.proceed(joinPoint.getArgs());
        long endTime = System.currentTimeMillis();
        long totalTime = endTime - startTime;
        //2、有無日誌監控註解,有則輸出
        String methodName = joinPoint.getTarget().getClass().getName() + "." + joinPoint.getSignature().getName() + "()";
        MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature();
        Method targetMethod = methodSignature.getMethod();
        if (targetMethod.isAnnotationPresent(MapperMonitor.class)) {
            logger.info("**********Method:{}, Start:{}, End:{}, Total:{}ms**********",methodName, dateFormat.format(startTime), dateFormat.format(endTime), totalTime);
        }
        return result;
    }

    @AfterThrowing(pointcut = "mapperLog()", throwing = "e")
    public void doAfterThrowing(Exception e) throws Exception{
        throw new SqlException(e);
    }

}

5、自定義SQL異常

package com.czgo.exception;
 
/**
 * 自定義異常類(繼承執行時異常)
 * @author zhangzhixiang
 * @version 2018/11/09
 */
public class SqlException extends RuntimeException {
 
    private static final long serialVersionUID = 1L;
 
    /**
     * 錯誤編碼
     */
    private String errorCode;
 
    /**
     * 訊息是否為屬性檔案中的Key
     */
    private boolean propertiesKey = true;
     
    /**
     * 構造一個基本異常.
     *
     * @param cause 異常資訊
     *            
     */
    public SqlException(Throwable cause)
    {
        super(cause);
    }

    /**
     * 構造一個基本異常.
     *
     * @param message 資訊描述
     *            
     */
    public SqlException(String message)
    {
        super(message);
    }
 
    /**
     * 構造一個基本異常.
     *
     * @param errorCode 錯誤編碼
     * @param message 資訊描述
     *            
     */
    public SqlException(String errorCode, String message)
    {
        this(errorCode, message, true);
    }
 
    /**
     * 構造一個基本異常.
     *
     * @param errorCode 錯誤編碼
     * @param message 
     *                 
     */
    public SqlException(String errorCode, String message, Throwable cause)
    {
        this(errorCode, message, cause, true);
    }
 
    /**
     * 構造一個基本異常.
     *
     * @param errorCode 錯誤編碼
     * @param message 資訊描述
     * @param propertiesKey 訊息是否為屬性檔案中的Key
     *            
     */
    public SqlException(String errorCode, String message, boolean propertiesKey)
    {
        super(message);
        this.setErrorCode(errorCode);
        this.setPropertiesKey(propertiesKey);
    }
 
    /**
     * 構造一個基本異常.
     *
     * @param errorCode 錯誤編碼
     * @param message 資訊描述
     *            
     */
    public SqlException(String errorCode, String message, Throwable cause, boolean propertiesKey)
    {
        super(message, cause);
        this.setErrorCode(errorCode);
        this.setPropertiesKey(propertiesKey);
    }
 
    /**
     * 構造一個基本異常.
     *
     * @param message 資訊描述
     * @param cause 根異常類(可以存入任何異常)
     *            
     */
    public SqlException(String message, Throwable cause)
    {
        super(message, cause);
    }
    
    public String getErrorCode()
    {
        return errorCode;
    }
 
    public void setErrorCode(String errorCode)
    {
        this.errorCode = errorCode;
    }
 
    public boolean isPropertiesKey()
    {
        return propertiesKey;
    }
 
    public void setPropertiesKey(boolean propertiesKey)
    {
        this.propertiesKey = propertiesKey;
    }
    
}

全篇文章完全純手打,如果覺得對您有幫助,記得加關注給好評喲~~