溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Spring Boot如何使用AOP記錄日志

發布時間:2021-09-06 14:28:44 來源:億速云 閱讀:203 作者:小新 欄目:web開發

小編給大家分享一下Spring Boot如何使用AOP記錄日志,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

在項目開發中經常,日志系統是必不可少的,特別是管理系統,對于重要的操作都會有操作日志,然而這個操作不需要我們在相應的方法中一個一個的去實現,這肯定是不合適的,這樣的操作無疑是加大了開發量,而且不易維護,所以實際項目中總是利用AOP(Aspect  Oriented Programming)即面向切面編程來記錄系統中的操作日志。

下面就來介紹如何在 Spring Boot 中 使用 AOP 記錄日志:

加入依賴

首先加入 AOP 依賴:

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

創建日志注解類

創建一個日志注解類,這樣就可以在需要記錄日志的方法上加上注解就可以記錄日志了,注解內容如下:

@Target({ElementType.PARAMETER, ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface AopLogger {      String describe() default ""; }

配置 AOP 切面

定義一個 AopLoggerAspect 切面類,用 @Aspect 聲明該類為切面類。

@Component public class AopLoggerAspect {     private final Logger logger = LoggerFactory.getLogger(this.getClass());      @Pointcut("@annotation(com.wupx.aop.logger.annotation.AopLogger)")     public void aopLoggerAspect() {     }      /**      * 環繞觸發      *      * @param point      * @return      */     @Around("aopLoggerAspect()")     public Object doAround(ProceedingJoinPoint point) {         RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();         ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes) requestAttributes;         HttpServletRequest request = servletRequestAttributes.getRequest();         Object result = null;         long startTime = System.currentTimeMillis();         try {             result = point.proceed();         } catch (Throwable throwable) {             throwable.printStackTrace();             logger.error(throwable.getMessage());         }         String describe = getAopLoggerDescribe(point);         if (StringUtils.isBlank(describe)) {             describe = "-";         }         // 打印請求相關參數         logger.info("========================================== Start ==========================================");         logger.info("Describe       : {}", describe);         // 打印請求 url         logger.info("URL            : {}", request.getRequestURL());         logger.info("URI            : {}", request.getRequestURI());         // 打印 Http method         logger.info("HTTP Method    : {}", request.getMethod());         // 打印調用 controller 的全路徑以及執行方法         logger.info("Class Method   : {}.{}", point.getSignature().getDeclaringTypeName(), point.getSignature().getName());         // 打印請求的 IP         logger.info("IP             : {}", request.getRemoteAddr());         // 打印請求入參         logger.info("Request Args   : {}", point.getArgs());         // 打印請求出參         logger.info("Response Args  : {}", result);         logger.info("Time Consuming : {} ms", System.currentTimeMillis() - startTime);         logger.info("=========================================== End ===========================================");         return result;     }      /**      * 獲取注解中對方法的描述信息      *      * @param joinPoint 切點      * @return describe      */     public static String getAopLoggerDescribe(JoinPoint joinPoint) {         MethodSignature signature = (MethodSignature) joinPoint.getSignature();         Method method = signature.getMethod();         AopLogger controllerLog = method.getAnnotation(AopLogger.class);         return controllerLog.describe();     } }

其中 「@Pointcut」 是定義一個切點,后面跟隨一個表達式,表達式可以定義為某個 package 下的方法,也可以是自定義注解等。

「@Around」 為在切入點前后織入代碼,并且可以自由的控制何時執行切點。

測試

接下來編寫 Controller 層來進行測試:

@RestController @RequestMapping("/user") public class UserController {      private final UserService userService;      public UserController(UserService userService) {         this.userService = userService;     }      @PostMapping     @AopLogger(describe = "添加用戶")     public String addUser(@RequestBody User user) {         UserEntity userEntity = new UserEntity();         BeanUtils.copyProperties(user, userEntity);         return userService.addUser(userEntity);     } }

只需要在接口上填寫 @AopLogger 就可以記錄操作日志。

啟動服務,通過 PostMan 請求 http://localhost:8080/user 接口,輸出的日志如下所示:

Spring Boot如何使用AOP記錄日志

可以看到把入參、出參以及接口信息都記錄了下來,是不是很簡單呢,只需要簡單幾步就可以實現 AOP 日志,大家可以自己實踐下。

本文的完整代碼在 https://github.com/wupeixuan/SpringBoot-Learn 的 aop-logger 目錄下。

以上是“Spring Boot如何使用AOP記錄日志”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女