DB操做出入參日誌打印AOP配置web
背景:目前項目作中臺建設,要求統一打印DB操做的出入參,並以json格式輸出。spring
- 方案描述:
基於Spring Boot項目,經過自定義註解,使用AOP對自定義註解配置前置通知、後置通知對參數進行處理。日誌處理使用slf4j處理,須要打印日誌的類只需添加@Slf4j註解。@Profile({"dev", "test",」prod」})能夠配置在配置切面的類上,這樣能夠選擇在哪一個環境使用該切面配置。json
- 實施步驟:
- Spring項目添加maven依賴spring-boot-starter-aop注入AOP功能,添加gson依賴注入json輸出功能。
<dependency>maven
<groupId>org.springframework.boot</groupId>spring-boot
<artifactId>spring-boot-starter-aop</artifactId>google
</dependency>spa
<dependency>debug
<groupId>com.google.code.gson</groupId>日誌
<artifactId>gson</artifactId>code
<version>2.8.5</version>
</dependency>
- 自定義註解,以下定義
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD})
@Documentedpublic @interface DBLog {
String description() default "";
}
- 配置切面
c一、配置切點:建立DBLogAspect類,使用@Pointcut註解聲明切點。如 下代碼
@Pointcut(「DBLog 」)
Public void dbParameterLog(){
//empty
}
c二、定義@Around環繞通知,用於記錄執行時間。以下代碼
@Around("dbParameterLog()")
public Object doAround(ProceedingJoinPoint pjp) throws Throwable {
long startTime = System.currentTimeMillis();
Object ob = pjp.proceed();// ob 爲方法的返回值
logger.info("Response Args : {}", new Gson().toJson(result));
logger.info("耗時 : " + (System.currentTimeMillis() - startTime));
return ob;
}
C三、定義@Before通知打印入參。代碼以下
@Before("dbParameterLog()")
public void doBefore(JoinPoint joinPoint) throws Throwable {
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequest request = attributes.getRequest();
loggger.info("參數 : " + joinPoint.getArgs());
}
C四、定義@AfterReturning通知打印出參。代碼以下
@AfterReturning(returning = "ret", pointcut = "dbParameterLog()")
public void doAfterReturning(Object ret) throws Throwable {
logger.debug("返回值 : " + JSON.toJSONString(ret));
}
C五、定義@After通知打印方法內代碼邏輯執行結束。代碼以下
@After("webLog()")
public void doAfter() throws Throwable {
logger.info("======= End ============" + LINE_SEPARATOR);
}
d、如何使用
把DBLog 註解添加到CRUD的接口上就能夠打印參數。