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

又被逼著優化代碼,這次我干掉了出入參 Log日志

系統
最近技術部突然刮起一陣 review 代碼的小風,挨個項目組過代碼,按理說這應該是件挺好的事,讓別人指出自己代碼中的不足,查缺補漏,對提升自身編碼能力有很大幫助,畢竟自己審查很容易“陶醉”在自己寫的代碼里。

本文轉載自微信公眾號「程序員內點事」,作者程序員內點事。轉載本文請聯系程序員內點事公眾號。

最近技術部突然刮起一陣 review 代碼的小風,挨個項目組過代碼,按理說這應該是件挺好的事,讓別人指出自己代碼中的不足,查缺補漏,對提升自身編碼能力有很大幫助,畢竟自己審查很容易“陶醉”在自己寫的代碼里。

[[334348]]

 

不過,代碼 review 的詳細程度令人發指,一行一行的分析,簡直就是個培訓班啊。不夸張的說,如果我村里僅有縣重點小學學歷的四大爺,來聽上一個月后,保證能上手開發,666~

既然組內氣氛到這了,咱也得行動起來,要不哪天評審到我的代碼,讓人家指指點點的心里多少有點不舒服,與其被動優化代碼不如主動出擊~

選優化代碼的方向,方法入參和返回結果日志首當其沖,每個方法都會有這兩個日志,一大堆冗余的代碼,而且什么樣的打印格式都有,非常的雜亂。

  1. public OrderDTO getOrder(OrderVO orderVO, String name) { 
  2.  
  3.         log.info("訂單詳情入參:orderVO={},name={}", JSON.toJSONString(orderVO), name); 
  4.  
  5.         OrderDTO orderInfo = orderService.getOrderInfo(orderVO); 
  6.  
  7.         log.info("訂單詳情結果:orderInfo={}", JSON.toJSONString(orderInfo)); 
  8.  
  9.         return orderInfo; 

下邊我們利用 AOP 實現請求方法的入參、返回結果日志統一打印,避免日志打印格式雜亂,同時減少業務代碼量。

一、自定義注解

自定義切面注解@PrintlnLog 用來輸出日志,注解權限 @Target({ElementType.METHOD}) 限制只在方法上使用,注解中只有一個參數 description ,用來自定義方法輸出日志的描述。

  1. @Retention(RetentionPolicy.RUNTIME) 
  2. @Target({ElementType.METHOD}) 
  3. @Documented 
  4. public @interface PrintlnLog { 
  5.  
  6.     /** 
  7.      * 自定義日志描述信息文案 
  8.      * 
  9.      * @return 
  10.      */ 
  11.     String description() default ""

二、切面類

接下來編寫@PrintlnLog 注解對應的切面實現,doBefore()中輸出方法的自定義描述、入參、請求方式、請求url、被調用方法的位置等信息,doAround() 中打印方法返回結果。

注意: 如何想指定切面在哪個環境執行,可以用@Profile 注解,只打印某個環境的日志。

  1. @Slf4j 
  2. @Aspect 
  3. @Component 
  4. //@Profile({"dev"}) //只對某個環境打印日志 
  5. public class LogAspect { 
  6.  
  7.     private static final String LINE_SEPARATOR = System.lineSeparator(); 
  8.  
  9.     /** 
  10.      * 以自定義 @PrintlnLog 注解作為切面入口 
  11.      */ 
  12.     @Pointcut("@annotation(com.chengxy.unifiedlog.config.PrintlnLog)"
  13.     public void PrintlnLog() { 
  14.     } 
  15.  
  16.     /** 
  17.      * @param joinPoint 
  18.      * @author fu 
  19.      * @description 切面方法入參日志打印 
  20.      * @date 2020/7/15 10:30 
  21.      */ 
  22.     @Before("PrintlnLog()"
  23.     public void doBefore(JoinPoint joinPoint) throws Throwable { 
  24.  
  25.         ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); 
  26.         HttpServletRequest request = attributes.getRequest(); 
  27.  
  28.         String methodDetailDescription = this.getAspectMethodLogDescJP(joinPoint); 
  29.  
  30.         log.info("------------------------------- start --------------------------"); 
  31.         /** 
  32.          * 打印自定義方法描述 
  33.          */ 
  34.         log.info("Method detail Description: {}", methodDetailDescription); 
  35.         /** 
  36.          * 打印請求入參 
  37.          */ 
  38.         log.info("Request Args: {}", JSON.toJSONString(joinPoint.getArgs())); 
  39.         /** 
  40.          * 打印請求方式 
  41.          */ 
  42.         log.info("Request method: {}", request.getMethod()); 
  43.         /** 
  44.          * 打印請求 url 
  45.          */ 
  46.         log.info("Request URL: {}", request.getRequestURL().toString()); 
  47.  
  48.         /** 
  49.          * 打印調用方法全路徑以及執行方法 
  50.          */ 
  51.         log.info("Request Class and Method: {}.{}", joinPoint.getSignature().getDeclaringTypeName(), joinPoint.getSignature().getName()); 
  52.     } 
  53.  
  54.     /** 
  55.      * @param proceedingJoinPoint 
  56.      * @author xiaofu 
  57.      * @description 切面方法返回結果日志打印 
  58.      * @date 2020/7/15 10:32 
  59.      */ 
  60.     @Around("PrintlnLog()"
  61.     public Object doAround(ProceedingJoinPoint proceedingJoinPoint) throws Throwable { 
  62.  
  63.         String aspectMethodLogDescPJ = getAspectMethodLogDescPJ(proceedingJoinPoint); 
  64.  
  65.         long startTime = System.currentTimeMillis(); 
  66.  
  67.         Object result = proceedingJoinPoint.proceed(); 
  68.         /** 
  69.          * 輸出結果 
  70.          */ 
  71.         log.info("{},Response result  : {}", aspectMethodLogDescPJ, JSON.toJSONString(result)); 
  72.  
  73.         /** 
  74.          * 方法執行耗時 
  75.          */ 
  76.         log.info("Time Consuming: {} ms", System.currentTimeMillis() - startTime); 
  77.  
  78.         return result; 
  79.     } 
  80.  
  81.     /** 
  82.      * @author xiaofu 
  83.      * @description 切面方法執行后執行 
  84.      * @date 2020/7/15 10:31 
  85.      */ 
  86.     @After("PrintlnLog()"
  87.     public void doAfter(JoinPoint joinPoint) throws Throwable { 
  88.         log.info("------------------------------- End --------------------------" + LINE_SEPARATOR); 
  89.     } 
  90.  
  91.     /** 
  92.      * @param joinPoint 
  93.      * @author xiaofu 
  94.      * @description @PrintlnLog 注解作用的切面方法詳細細信息 
  95.      * @date 2020/7/15 10:34 
  96.      */ 
  97.     public String getAspectMethodLogDescJP(JoinPoint joinPoint) throws Exception { 
  98.         String targetName = joinPoint.getTarget().getClass().getName(); 
  99.         String methodName = joinPoint.getSignature().getName(); 
  100.         Object[] arguments = joinPoint.getArgs(); 
  101.         return getAspectMethodLogDesc(targetName, methodName, arguments); 
  102.     } 
  103.  
  104.     /** 
  105.      * @param proceedingJoinPoint 
  106.      * @author xiaofu 
  107.      * @description @PrintlnLog 注解作用的切面方法詳細細信息 
  108.      * @date 2020/7/15 10:34 
  109.      */ 
  110.     public String getAspectMethodLogDescPJ(ProceedingJoinPoint proceedingJoinPoint) throws Exception { 
  111.         String targetName = proceedingJoinPoint.getTarget().getClass().getName(); 
  112.         String methodName = proceedingJoinPoint.getSignature().getName(); 
  113.         Object[] arguments = proceedingJoinPoint.getArgs(); 
  114.         return getAspectMethodLogDesc(targetName, methodName, arguments); 
  115.     } 
  116.  
  117.     /** 
  118.      * @param targetName 
  119.      * @param methodName 
  120.      * @param arguments 
  121.      * @author xiaofu 
  122.      * @description 自定義注解參數 
  123.      * @date 2020/7/15 11:51 
  124.      */ 
  125.     public String getAspectMethodLogDesc(String targetName, String methodName, Object[] arguments) throws Exception { 
  126.         Class targetClass = Class.forName(targetName); 
  127.         Method[] methods = targetClass.getMethods(); 
  128.         StringBuilder description = new StringBuilder(""); 
  129.         for (Method method : methods) { 
  130.             if (method.getName().equals(methodName)) { 
  131.                 Class[] clazzs = method.getParameterTypes(); 
  132.                 if (clazzs.length == arguments.length) { 
  133.                     description.append(method.getAnnotation(PrintlnLog.class).description()); 
  134.                     break; 
  135.                 } 
  136.             } 
  137.         } 
  138.         return description.toString(); 
  139.     } 

三、應用

我們在需要打印入參和返回結果日志的方法,加上@PrintlnLog注解,并添加自定義方法描述。

  1. @RestController 
  2. @RequestMapping 
  3. public class OrderController { 
  4.  
  5.     @Autowired 
  6.     private OrderService orderService; 
  7.  
  8.     @PrintlnLog(description = "訂單詳情Controller"
  9.     @RequestMapping("/order"
  10.     public OrderDTO getOrder(OrderVO orderVO, String name) { 
  11.  
  12.         OrderDTO orderInfo = orderService.getOrderInfo(orderVO); 
  13.  
  14.         return orderInfo; 
  15.     } 

代碼里去掉 log.info日志打印,加上 @PrintlnLog 看一下效果,清晰明了。

 

 

Demo GitHub地址:https://github.com/chengxy-nds/Springboot-Notebook/tree/master/springboot-aop-unifiedlog

 

責任編輯:武曉燕 來源: 程序員內點事
相關推薦

2020-04-09 08:29:50

編程語言事件驅動

2020-10-10 09:09:21

CTOCRUD設計

2020-11-09 14:03:51

Spring BootMaven遷移

2019-11-26 10:07:10

業務開發邏輯

2022-09-26 10:01:04

SpringAOP日志

2018-03-23 05:25:18

5GWiFi網絡

2025-05-13 07:02:43

2019-12-02 10:34:19

Python虛擬機內存

2021-04-20 08:02:08

業務數據用戶

2021-04-27 10:26:57

微軟Linux桌面

2024-02-19 09:10:46

OpenAISora功能

2020-12-28 13:43:03

MacWindowsSurface

2023-11-29 09:09:27

OceanBase底層

2022-04-06 21:50:08

區塊鏈互聯網支付

2021-09-09 18:12:22

內存分段式網絡

2014-12-01 11:20:28

Win8.1微軟

2020-01-21 19:21:44

WindowsWindows 10Windows XP

2018-10-06 15:38:12

2022-03-26 08:49:13

MySQL數據存儲

2021-02-23 09:06:00

MVCC版本并發
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产一区二区精品在线观看 | 华丽的挑战在线观看 | 久久成人国产精品 | 午夜专区 | 九九亚洲精品 | 欧美一区二区在线播放 | 黄色大片免费观看 | 精品视频一区二区三区在线观看 | 日本a网站 | av电影手机版 | 91成人在线视频 | 国产精品中文在线 | 天天操网 | 亚洲一区国产 | 亚洲一区二区三区观看 | 欧州一区二区 | 欧美韩一区二区 | 欧美a级成人淫片免费看 | 欧美在线视频二区 | 久久国产精品一区 | 伊人在线 | 99re视频精品 | 久久精品国产免费 | 久久影院一区 | 欧美精品在欧美一区二区少妇 | 久色| 日本精品一区二区三区在线观看视频 | 日韩精品视频一区二区三区 | 日韩有码在线观看 | 黄网站涩免费蜜桃网站 | 国产目拍亚洲精品99久久精品 | 欧美视频成人 | 国产一区二区在线免费观看 | 成人天堂噜噜噜 | 国产一区二区三区网站 | 国产高清久久久 | 亚洲日本欧美日韩高观看 | 91天堂网 | 日韩成人影院在线观看 | 成人在线视频网站 | 欧美国产日韩成人 |