摘要:簡介在前段時間,看自己寫的代碼的時候,發現存在大量繁瑣的日志記錄,影響觀感不說,后期的維護上也是十分麻煩,決定通過去解決這個問題,先做記錄。
簡介
在前段時間,看自己寫的代碼的時候,發現存在大量繁瑣的日志記錄,影響觀感不說,后期的維護上也是十分麻煩,決定通過AOP去解決這個問題,先做記錄。
與SpringBoot框架的整合所需要的依賴包org.springframework.boot spring-boot-starter-aop org.projectlombok lombok com.alibaba fastjson
通過查閱網上資料,了解到通過AOP記錄日志,存在兩種方式
基于注解
基于表達式
詳細說明 一、基于注解的AOP日志在使用注解這種方式前,我們需要自定義一個屬于自己的注解@VoiceLog
import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) public @interface VoiceLog { }
@@Target說明該注解的使用范圍,包含10個枚舉值;
@Retention說明編譯程序如何對待自定義的Annotation,包含三個枚舉值:SOURCE,CLASS,RUNTIME;
完成之后,繼續下面的步驟
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import lombok.extern.slf4j.Slf4j; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.reflect.MethodSignature; import org.springframework.stereotype.Component; @Aspect // 聲明這是一個切面類 @Component // 注冊為一個bean @Slf4j // lombok日志注解 public class AspectLog { /** * 對存在注解 `VoiceLog`的方法做日志記錄 * * @param joinPoint joinPoint * @param voiceLog voiceLog * @throws Throwable Throwable * @see VoiceLog */ @Around(value = "@annotation(voiceLog)") // aspect增強注解,對存在該注解方法的前后做攔截 public Object logAroud(ProceedingJoinPoint joinPoint, VoiceLog voiceLog) throws Throwable { // 獲取當前毫秒 long beginTime = System.currentTimeMillis(); // 執行方法體 Object result = joinPoint.proceed(); // 計算方法執行時間 long time = System.currentTimeMillis() - beginTime; //獲取當前方法的類名 String className = joinPoint.getTarget().getClass().getSimpleName(); // 獲取切點處的簽名 MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature(); // 獲取當前的方法名 String methodName = methodSignature.getMethod().getName(); // 獲取參數名稱 String[] paramNames = methodSignature.getParameterNames(); // 獲取參數值 Object[] params = joinPoint.getArgs(); // 把參數名稱和參數值組裝成json格式 JSONObject paramsJson = new JSONObject(paramNames.length); for (int i = 0; i < paramNames.length; i++) { paramsJson.put(paramNames[i], params[i]); } // 日志輸出 log.info("TargetClass:{}; method:{}; requestParams:{}; response:{}; time:{}ms", className, methodName, paramsJson.toJSONString(), result, time); return Object; } }
配置文件添加配置
spring.aop.proxy-target-class=true
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/75805.html
摘要:自定義注解新增日志注解類,注解作用于方法級別,運行時起作用。自定義注解,聲明一種行為,使配置簡化,代碼層面更加簡潔。 showImg(https://segmentfault.com/img/remote/1460000017791628); 寫在前面 本文不涉及過多的Spring aop基本概念以及基本用法介紹,以實際場景使用為主。 場景 我們通常有這樣一個需求:打印后臺接口請求的具...
摘要:連接對象執行命令對象執行關閉值得注意的是,對數據庫連接池是有很好的支持的。給我們提供了事務的管理器類,事務管理器類又分為兩種,因為的事務和的事務是不一樣的。 前言 上一篇Spring博文主要講解了如何使用Spring來實現AOP編程,本博文主要講解Spring的DAO模塊對JDBC的支持,以及Spring對事務的控制... 對于JDBC而言,我們肯定不會陌生,我們在初學的時候肯定寫過非...
摘要:幾乎每一個接口被調用后,都要記錄一條跟這個參數掛鉤的特定的日志到數據庫。我最終采用了的方式,采取攔截的請求的方式,來記錄日志。所有打上了這個注解的方法,將會記錄日志。那么如何從眾多可能的參數中,為當前的日志指定對應的參數呢。 前言 不久前,因為需求的原因,需要實現一個操作日志。幾乎每一個接口被調用后,都要記錄一條跟這個參數掛鉤的特定的日志到數據庫。舉個例子,就比如禁言操作,日志中需要記...
摘要:入門篇學習總結時間年月日星期三說明本文部分內容均來自慕課網。主要的功能是日志記錄,性能統計,安全控制,事務處理,異常處理等等。 《Spring入門篇》學習總結 時間:2017年1月18日星期三說明:本文部分內容均來自慕課網。@慕課網:http://www.imooc.com教學示例源碼:https://github.com/zccodere/s...個人學習源碼:https://git...
摘要:面向切面的本章主要內容面向切面編程的基本原理通過創建切面使用注解為切面注入依賴。什么是面向切面編程切面能夠幫我們模塊化橫切關注點。在使用面向切面編程時,我們仍然在一個地方定義通知功能,而無需修改受影響的類。切面切面是通知和切點的結合。 面向切面的Spring 本章主要內容: 面向切面編程的基本原理 通過POJO創建切面 使用@Aspect注解 為AspectJ切面注入依賴。 說明 ...
閱讀 2444·2021-11-19 09:59
閱讀 1973·2019-08-30 15:55
閱讀 930·2019-08-29 13:30
閱讀 1330·2019-08-26 10:18
閱讀 3081·2019-08-23 18:36
閱讀 2382·2019-08-23 18:25
閱讀 1156·2019-08-23 18:07
閱讀 430·2019-08-23 17:15