成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Spring Boot 使用 AOP 記錄日志

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

[[384373]]

本文轉載自微信公眾號「武培軒」,作者武培軒 。轉載本文請聯系武培軒公眾號。

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

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

加入依賴

首先加入 AOP 依賴:

  1. <dependency> 
  2.  <groupId>org.springframework.boot</groupId> 
  3.  <artifactId>spring-boot-starter-aop</artifactId> 
  4. </dependency> 

 

創建日志注解類

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

  1. @Target({ElementType.PARAMETER, ElementType.METHOD}) 
  2. @Retention(RetentionPolicy.RUNTIME) 
  3. @Documented 
  4. public @interface AopLogger { 
  5.  
  6.     String describe() default ""

配置 AOP 切面

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

  1. @Component 
  2. public class AopLoggerAspect { 
  3.     private final Logger logger = LoggerFactory.getLogger(this.getClass()); 
  4.  
  5.     @Pointcut("@annotation(com.wupx.aop.logger.annotation.AopLogger)"
  6.     public void aopLoggerAspect() { 
  7.     } 
  8.  
  9.     /** 
  10.      * 環繞觸發 
  11.      * 
  12.      * @param point 
  13.      * @return 
  14.      */ 
  15.     @Around("aopLoggerAspect()"
  16.     public Object doAround(ProceedingJoinPoint point) { 
  17.         RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes(); 
  18.         ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes) requestAttributes; 
  19.         HttpServletRequest request = servletRequestAttributes.getRequest(); 
  20.         Object result = null
  21.         long startTime = System.currentTimeMillis(); 
  22.         try { 
  23.             result = point.proceed(); 
  24.         } catch (Throwable throwable) { 
  25.             throwable.printStackTrace(); 
  26.             logger.error(throwable.getMessage()); 
  27.         } 
  28.         String describe = getAopLoggerDescribe(point); 
  29.         if (StringUtils.isBlank(describe)) { 
  30.             describe = "-"
  31.         } 
  32.         // 打印請求相關參數 
  33.         logger.info("========================================== Start =========================================="); 
  34.         logger.info("Describe       : {}", describe); 
  35.         // 打印請求 url 
  36.         logger.info("URL            : {}", request.getRequestURL()); 
  37.         logger.info("URI            : {}", request.getRequestURI()); 
  38.         // 打印 Http method 
  39.         logger.info("HTTP Method    : {}", request.getMethod()); 
  40.         // 打印調用 controller 的全路徑以及執行方法 
  41.         logger.info("Class Method   : {}.{}", point.getSignature().getDeclaringTypeName(), point.getSignature().getName()); 
  42.         // 打印請求的 IP 
  43.         logger.info("IP             : {}", request.getRemoteAddr()); 
  44.         // 打印請求入參 
  45.         logger.info("Request Args   : {}", point.getArgs()); 
  46.         // 打印請求出參 
  47.         logger.info("Response Args  : {}", result); 
  48.         logger.info("Time Consuming : {} ms", System.currentTimeMillis() - startTime); 
  49.         logger.info("=========================================== End ==========================================="); 
  50.         return result; 
  51.     } 
  52.  
  53.     /** 
  54.      * 獲取注解中對方法的描述信息 
  55.      * 
  56.      * @param joinPoint 切點 
  57.      * @return describe 
  58.      */ 
  59.     public static String getAopLoggerDescribe(JoinPoint joinPoint) { 
  60.         MethodSignature signature = (MethodSignature) joinPoint.getSignature(); 
  61.         Method method = signature.getMethod(); 
  62.         AopLogger controllerLog = method.getAnnotation(AopLogger.class); 
  63.         return controllerLog.describe(); 
  64.     } 

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

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

測試

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

  1. @RestController 
  2. @RequestMapping("/user"
  3. public class UserController { 
  4.  
  5.     private final UserService userService; 
  6.  
  7.     public UserController(UserService userService) { 
  8.         this.userService = userService; 
  9.     } 
  10.  
  11.     @PostMapping 
  12.     @AopLogger(describe = "添加用戶"
  13.     public String addUser(@RequestBody User user) { 
  14.         UserEntity userEntity = new UserEntity(); 
  15.         BeanUtils.copyProperties(user, userEntity); 
  16.         return userService.addUser(userEntity); 
  17.     } 

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

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

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

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

責任編輯:武曉燕 來源: 武培軒
相關推薦

2022-02-08 17:07:54

Spring BooSpring Aop日志記錄

2022-02-17 13:39:09

AOP接口方式

2021-08-11 05:00:48

Spring 日志手段

2024-09-02 00:27:51

SpringAOP自定義

2022-09-26 10:01:04

SpringAOP日志

2009-06-19 11:09:27

Spring AOP

2022-05-12 11:38:26

Java日志Slf4j

2023-09-13 08:56:51

2025-06-17 07:37:53

2021-05-18 07:30:36

開發Spring Boot日志

2009-06-19 13:28:30

Spring AOPSpring 2.0

2022-06-07 07:58:45

SpringSpring AOP

2025-03-12 14:09:56

2012-07-11 14:31:16

SpringAop

2019-04-15 08:32:25

Spring Boot日志門面模式

2009-06-22 10:41:34

Spring.AOP

2020-10-18 08:51:18

Spring Boot

2023-05-11 12:40:00

Spring控制器HTTP

2022-06-08 08:04:28

Springservicerepository

2022-02-09 20:39:52

Actuator應用監控
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: av中文字幕网 | 国产精品视频网 | 人人玩人人添人人澡欧美 | 99色播| 日韩中文一区二区三区 | 成人欧美一区二区三区黑人孕妇 | 国产一区二区视频在线观看 | 中文字幕在线观看一区二区 | 国产免费av在线 | 精品综合久久久 | 在线成人免费视频 | 国产精品视频免费观看 | 99精品视频免费在线观看 | 精品国产鲁一鲁一区二区张丽 | 国产激情视频网 | 色噜噜亚洲男人的天堂 | 久草欧美 | 日韩国产在线观看 | 国产福利视频在线观看 | 欧美在线日韩 | 亚洲精品日韩精品 | 国产精品久久久久久久免费观看 | 99久久婷婷国产综合精品电影 | 国产精品久久久久久一级毛片 | 精品免费视频一区二区 | 国产视频久久久久 | 99re视频这里只有精品 | 免费观看一级特黄欧美大片 | 午夜影院操 | 九色av | 天天色综| 久久久久久国产 | 国产精品一二区 | 国产a区 | 欧美freesex黑人又粗又大 | 毛片一级片 | 欧美黑人一区二区三区 | 国产一区二 | av片在线观看 | 精品一区二区三区中文字幕 | 99福利在线观看 |