SpringBoot通過AOP實現系統日誌記錄(三)-Mapper層日誌監控及自定義異常攔截
阿新 • • 發佈:2018-12-23
本文是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;
}
}
全篇文章完全純手打,如果覺得對您有幫助,記得加關注給好評喲~~