精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

高效日志打印技巧,簡潔又清晰

開發 前端
不同的業務場景有不同的日志需求,一般情況下為了排查問題方便,需要唯一標識把一系列請求串聯起來,使用 UserLog 注解+Aop ,自動將這部分默認參數放到日志中,可以簡化業務日志打印,極大地提高了生產力。
為了更方便地排查問題,電商交易系統的日志中需要記錄用戶id和訂單id等字段。然而,每次打印日志都需要手動設置用戶id,這一過程非常繁瑣,需要想個辦法優化下。
log.warn("user:{}, orderId:{} 訂單提單成功",userId, orderId);
log.warn("user:{}, orderId:{} 訂單支付成功",userId, orderId);
log.warn("user:{}, orderId:{} 訂單收到履約請求",userId, orderId);
log.warn("user:{}, orderId:{} 訂單履約成功",userId, orderId);

1、目標

打印日志時,自動填充用戶id和訂單Id等通參,無需手動指定

2、實現思路

  • 日志模板中聲明占位符 userId,orderId
  • 在業務入口將userId放入到線程ThreadLocal本地變量中。
  • 使用SpringAop + 注解 自動將第二步的用戶信息放到線程上下文

3、配置日志變量,讀取上下文變量

%X{}可以自定義占位符,例如本例中 使用 userId:%X{userId} orderId:%X{orderId},定義了userId和orderId兩個占位符。

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="info">

    <Appenders>
        <Console name="consoleAppender" target="SYSTEM_OUT">
            <PatternLayout pattern="%d{DEFAULT} [%t] %-5p - userId:%X{userId} orderId:%X{orderId} %m%n%ex" charset="UTF-8"/>
        </Console>
    </Appenders>
    <Loggers>
        <!-- Root Logger -->
        <AsyncRoot level="info" includeLocation="true">
            <appender-ref ref="consoleAppender"/>
        </AsyncRoot>
    </Loggers>
</Configuration>

4、基于MDC 將訂單和用戶信息放到線程的上下文Map

為了給每個請求添加唯一標識,用戶可將上下文信息放入MDC(Mapped Diagnostic Context)。

slfj 提供了MDC 類,可以將變量設置在線程上下文中,日志框架會自動將線程上下文中的變量放置到日志占位符中。Slf4j 作為java日志標準,log4j和logback都實現了slfj 日志標準。

MDC是基于每個線程進行管理的,允許每個服務器線程具有不同的MDC標記。MDC類中的put()和get()操作僅影響當前線程的MDC。其他線程中的MDC不會受到影響,所以可以理解MDC是基于ThreadLocal的Map。

例如下面這種方式,打印日志的效果是這樣的。

MDC.put("userId", userId);
MDC.put("orderId", orderId);
log.warn("訂單履約完成");

當使用log.warn("訂單履約完成") 方式打印日志時,代碼中會自動包含userId和 訂單Id。

2024-08-17 21:35:38,284 [main] WARN  - userId:32894934895 orderId:8497587947594859232 訂單履約完成

接下來,聲明一個注解加切面,自動將用戶和訂單信息放到日志占位符中。

5、注解 + SpringAop,自動將UserId放到MDC

通過注解的方式,在方法執行之前自動將UserId注入到MDC中。其中的難點在于如何獲取到UserId。

我的思路是,方法的入參中肯定包含了UserId。可以在注解中聲明UserId的獲取路徑,在切面中獲取到UserId,并將其注入到MDC中。

5.1 定義注解

@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface UserLog {

   String userId() default "";
   
   String orderId() default "";
}

使用時,要求輸入userId屬性的路徑。例如UserOrder中包含userId和orderId屬性,則像如下方式聲明。

@UserLog(userId = "userId", orderId = "orderId")
public void orderPerform(UserOrder order) {
   log.warn("訂單履約完成");
}

@Data
public static class UserOrder {
   String userId;
   String orderId;
}

5.2 定義切面

聲明注解的Aop切面,在方法執行前,將UserId從入參中取出來,放到MDC中。全部代碼如下

@Aspect
@Component
public class UserLogAspect {

   @Pointcut("@annotation(UserLog) && execution(public * *(..))")
   public void pointcut() {
   }

   @Around(value = "pointcut()")
   public Object around(ProceedingJoinPoint joinPoint) throws Throwable {
      //無參方法不處理
      Method method = ((MethodSignature) joinPoint.getSignature()).getMethod();
      Object[] args = joinPoint.getArgs();

      //獲取注解
      UserLog userLogAnnotation = method.getAnnotation(UserLog.class);
      if (userLogAnnotation != null && args != null && args.length > 0) {
         //使用工具類獲取userId。
         String userId = String.valueOf(PropertyUtils.getProperty(args[0], userLogAnnotation.userId()));
         String orderId = String.valueOf(PropertyUtils.getProperty(args[0], userLogAnnotation.orderId()));
         // 放到MDC中
         MDC.put("userId", userId);
         MDC.put("orderId", orderId);
      }

      try {
         Object response = joinPoint.proceed();
         return response;
      } catch (Exception e) {
         throw e;
      } finally {
         //清理MDC
         MDC.clear();
      }

   }
}

5.3 關鍵代碼解讀

5.3.1 獲取UserLog注解

UserLog userLogAnnotation = method.getAnnotation(UserLog.class);

5.3.2 使用PropertyUtils.getProperty 獲取userId

PropertyUtils.getProperty(args[0], userLogAnnotation.userId())

要注意 PropertyUtils 是commons-beanutils提供的工具類,可以指定屬性的路徑,自動提取屬性值。如果存在多層關系,可以使用 . 級聯取屬性值。

例如 info.userId,則從對象的info屬性中取userId屬性。

<dependency>
    <groupId>commons-beanutils</groupId>
    <artifactId>commons-beanutils</artifactId>
    <version>1.9.4</version>
</dependency>

5.3.3 使用MDC設置變量和清除變量。

MDC.put("userId", userId);
MDC.clear();

6、驗證使用效果

6.1 聲明業務Service

@Service
public class OrderService {
   public static final Logger log = LoggerFactory.getLogger(OrderService.class);
   
   @UserLog(userId = "userId", orderId = "orderId")
   public void orderPerform(UserOrder order) {
      log.warn("訂單履約完成");
   }

   @Data
   public static class UserOrder {
      String userId;
      String orderId;
   }
}

6.2 測試日志打印

@Test
public void testUserLog() {
   OrderService.UserOrder order = new OrderService.UserOrder();
   order.setUserId("32894934895");
   order.setOrderId("8497587947594859232");
   orderService.orderPerform(order);
}

6.3 日志效果

圖片圖片

7、總結

不同的業務場景有不同的日志需求,一般情況下為了排查問題方便,需要唯一標識把一系列請求串聯起來,使用 UserLog 注解+Aop ,自動將這部分默認參數放到日志中,可以簡化業務日志打印,極大地提高了生產力。

另外大家可以自行擴展能力,例如自動打印出入參日志,自動上報監控打點等等。

責任編輯:武曉燕 來源: 一安未來
相關推薦

2024-01-30 08:54:05

JavaScript技巧代碼

2019-07-31 10:24:16

JavaScript瀏覽器口袋妖怪

2023-07-30 17:10:32

TypeScript開發

2019-07-24 15:29:55

JavaScript開發 技巧

2018-06-08 09:50:07

程序員開發技巧Java

2021-01-19 13:10:29

ZshLinuxUbuntu

2021-03-16 09:48:51

FaustPython數據流

2025-02-27 10:20:49

2010-09-06 09:06:22

CSS

2012-12-25 09:45:08

PythonWeb

2024-11-04 09:47:59

2025-10-31 00:30:00

.NET內存優化

2018-10-19 12:37:47

GitHub代碼開發者

2012-01-09 17:03:39

臺式機評測

2024-11-11 17:00:27

字典壓縮Python代碼

2025-11-04 09:31:44

2024-12-04 15:10:21

2023-08-27 16:19:09

JavaScript編程語言

2024-03-28 14:29:46

JavaScript編程

2024-12-19 09:05:13

Python鏈式調用
點贊
收藏

51CTO技術棧公眾號

57pao国产一区二区| 成人在线高清视频| 99在线精品视频在线观看| 日韩国产高清污视频在线观看| av天堂永久资源网| 欧美成人三区| 成人黄色国产精品网站大全在线免费观看 | 91久久精品无嫩草影院| 精品高清一区二区三区| 亚洲v欧美v另类v综合v日韩v| 精品国自产在线观看| 捆绑裸体绳奴bdsm亚洲| 日本在线视频www鲁啊鲁| 91美女片黄在线| 91在线免费看网站| 亚洲视频 欧美视频| 亚洲精品a级片| 精品亚洲一区二区三区四区五区| 天天爽夜夜爽一区二区三区| 成人福利影视| 亚洲四区在线观看| 日韩欧美一区二区三区四区 | 亚洲第一精品自拍| 亚洲欧美日韩综合网| 一区二区乱码| 亚洲男人的天堂av| 日韩免费中文专区| 熟妇人妻中文av无码| 精品一区二区三区在线播放| 欧洲成人性视频| 久久精品久久国产| 亚洲91视频| 中国china体内裑精亚洲片| 你懂得在线视频| av动漫精品一区二区| 在线成人免费观看| 亚洲这里只有精品| 秋霞国产精品| 色国产综合视频| 超碰97人人射妻| xxxx视频在线| 亚洲成a人片综合在线| 裸体裸乳免费看| 秋霞午夜在线观看| 国产精品九色蝌蚪自拍| 日韩精品国内| yourporn在线观看中文站| 久久久久久日产精品| 久久国产精品久久| 天天色综合av| 91婷婷韩国欧美一区二区| 精品产品国产在线不卡| 男人天堂av网| 成人国产精品免费观看动漫| 国产成人亚洲欧美| 好吊视频一区二区三区| 成人午夜精品在线| 国产一区二区三区四区五区加勒比| а√天堂资源在线| 久草中文在线观看| 偷拍自拍在线| 青青草伊人久久| 国产精品福利在线| 中文字幕欧美人妻精品一区蜜臀| 石原莉奈一区二区三区在线观看| 青草青草久热精品视频在线观看| 天天插天天操天天干| 久久久国产精品一区二区中文| 国产91精品最新在线播放| 久久久久久久久久成人| 中文字幕在线看高清电影| 免费av不卡在线观看| 一个色妞综合视频在线观看| www婷婷av久久久影片| 免费在线一级片| 婷婷丁香激情网| 色综合888| 久久九九99视频| 色播亚洲视频在线观看| 日本不卡三区| 一区二区欧美国产| 色综合久久久久无码专区| 日韩伦理三区| 欧美电影一区二区| 粉嫩av懂色av蜜臀av分享| 禁果av一区二区三区| 中文字幕在线看视频国产欧美在线看完整| 永久免费看mv网站入口| 影音先锋国产精品| 国产精品久久久久久久久久99| 国产一区二区女内射| 国产aⅴ综合色| 欧美高清性xxxxhdvideosex| 在线看av的网址| 亚洲第一福利一区| www.精品在线| 久久97精品| 中文字幕综合在线| 免费毛片一区二区三区| 日本不卡一区二区三区| 99高清视频有精品视频| 精品久久久久一区二区三区 | 日韩中文字幕亚洲一区二区va在线 | 国产精品二区一区二区aⅴ| 久久xxxx精品视频| 91网免费观看| aaa在线免费观看| 亚洲高清免费观看| 色91精品久久久久久久久| 林ゆな中文字幕一区二区| 日韩中文视频免费在线观看| 欧美不卡视频在线观看| 国产黄人亚洲片| 日韩一区国产在线观看| 国产盗摄——sm在线视频| 色噜噜狠狠成人中文综合| wwwxx日本| 亚洲精品一二三区区别| 国产精品成人久久久久| 天天操天天干天天| 一区二区三区色| 成人综合久久网| 国产精品一区二区av日韩在线 | 亚洲精品在线视频观看| 女厕盗摄一区二区三区| 日韩欧美在线一区二区三区| 特黄一区二区三区| 日韩国产一区二| 久久久久天天天天| 成人免费一区二区三区牛牛| 日韩三级中文字幕| 欧洲美女女同性互添| 免费在线看一区| 日韩高清国产精品| 亚洲精品一区| 日韩av最新在线观看| 亚欧视频在线观看| 不卡一二三区首页| 国内少妇毛片视频| 日韩一区网站| 色综合色综合网色综合| www.日日夜夜| 亚洲黄色av一区| 韩国三级丰满少妇高潮| 888久久久| 亚洲自拍另类欧美丝袜| huan性巨大欧美| 日韩一区二区免费在线电影 | 中文字幕一区二区av| 91久热免费在线视频| 黄网站在线免费| 91精品国产一区二区人妖| www.av免费| 国产一区二区三区精品欧美日韩一区二区三区| 五月天婷亚洲天综合网鲁鲁鲁| 欧美大片免费高清观看| 国产一区二区av| 中文字幕在线日亚洲9| 中文字幕在线免费不卡| 亚洲小视频网站| 欧美日韩国产免费观看| 国产欧美日韩一区二区三区| 大菠萝精品导航| 亚洲欧美日韩一区二区在线| 9i看片成人免费看片| 久久精品在线观看| 免费成年人高清视频| 亚洲精品2区| 国产亚洲欧美一区二区三区| xxxxxx欧美| www.亚洲一区| 国产日韩欧美视频在线观看| 亚洲午夜激情av| 3d动漫精品啪啪一区二区下载 | 国产专区一区| 久久一区二区精品| julia一区二区三区中文字幕| 久久久999国产精品| 高h震动喷水双性1v1| 欧美日韩在线看| 少妇高潮一区二区三区喷水| 国产黄人亚洲片| 妞干网在线免费视频| 99国产精品免费视频观看| 97久久天天综合色天天综合色hd | 91福利视频导航| 成人一级福利| 日韩中文字幕精品视频| 欧美一级在线免费观看| 在线看国产一区| 麻豆changesxxx国产| 久久免费看少妇高潮| 一区二区久久精品| 久久经典综合| 国产又粗又猛又爽又黄的网站| 天堂99x99es久久精品免费| 国产女人18毛片水18精品| 51漫画成人app入口| 中文字幕不卡在线视频极品| 日韩在线观看视频一区二区三区| 欧美性猛片aaaaaaa做受| 久久精品无码人妻| 亚洲国产精品黑人久久久| 色悠悠在线视频| 精品一区二区三区在线播放视频| 国产资源在线视频| 一本到12不卡视频在线dvd| 久久亚洲国产精品日日av夜夜| 亚洲欧美久久精品| 国产成人av在线播放| 在线观看三级视频| 色噜噜久久综合伊人一本| 亚洲色图欧美视频| 精品卡一卡二卡三卡四在线| 一二区在线观看| 91成人国产精品| 日本少妇久久久| 亚洲男人的天堂av| 你懂得在线观看| 国产片一区二区三区| 中文字幕在线播放视频| 高清av一区二区| 国产九九九视频| 日本欧美久久久久免费播放网| www..com日韩| 国产精品99免费看| www.-级毛片线天内射视视| 精品国产一级毛片| 久久久久久国产精品一区| 国产精品久av福利在线观看| 147欧美人体大胆444| 日韩黄色三级| 国产在线视频2019最新视频| 免费污视频在线一区| 青青久久av北条麻妃黑人| 国产h片在线观看| 国产69精品久久久久99| 丁香花视频在线观看| 欧美激情一二三| 香蕉久久aⅴ一区二区三区| 久久精品视频在线观看| 毛片在线播放a| 久久视频精品在线| 黄色在线播放网站| 欧美成人h版在线观看| a在线免费观看| 九九精品在线观看| 欧美性爽视频| 久久久久久久久久久网站| 91超碰在线播放| 亚洲91精品在线观看| 在线天堂资源www在线污| 日韩免费观看av| 欧美日韩精品免费观看视欧美高清免费大片 | 久久国产一区| 免费一区二区| 日韩精品一线二线三线| 第一sis亚洲原创| 伊人久久大香线蕉午夜av| 91精品国产福利在线观看麻豆| 97精品国产97久久久久久粉红| 久久久久久久久国产一区| 免费极品av一视觉盛宴| 亚洲精品女人| 国产乱子夫妻xx黑人xyx真爽| 久久综合中文| 国产精欧美一区二区三区白种人| 国产一区二区三区不卡在线观看 | 男人揉女人奶房视频60分| 久久在线精品| 在线观看岛国av| 国产成人免费视频网站| 超碰97在线资源站| 亚洲国产成人在线| 亚洲国产成人精品综合99| 精品久久久久久国产| 日韩乱码一区二区三区| 在线播放/欧美激情| 亚洲精品字幕在线| 亚洲桃花岛网站| av网站大全在线| 欧美一区二区三区免费视| 欧美另类激情| 国产一区二区三区四区五区在线| 欧美一区电影| www国产免费| 水蜜桃久久夜色精品一区的特点| 三区视频在线观看| 91在线云播放| 日本激情视频一区二区三区| 激情亚洲一区二区三区四区| 在线播放一级片| 亚洲国模精品一区| 日韩黄色影院| 欧美在线一级视频| 激情不卡一区二区三区视频在线| 久久综合九色欧美狠狠| 午夜精品毛片| 日韩精品一区中文字幕| 国产成人在线观看免费网站| 久久久久久久毛片| 亚洲综合无码一区二区| 成人免费一区二区三区| 亚洲激情视频在线播放| 很黄的网站在线观看| 国产91精品最新在线播放| 91精品国产自产在线丝袜啪| 亚洲一区二区三区欧美| 国产精品久久国产愉拍| 手机看片国产精品| 国产亚洲短视频| 日韩欧美亚洲视频| 欧美精品视频www在线观看| 欧美女v视频| 国内伊人久久久久久网站视频| 亚洲在线资源| 亚洲国产精品一区在线观看不卡| aa亚洲婷婷| 蜜臀视频在线观看| 亚洲精品国产一区二区精华液 | 国产精品无码电影在线观看| 久久国产麻豆精品| 自拍偷拍视频亚洲| 精品国产乱码久久久久久婷婷| 成人福利小视频| 久久影院资源网| 少妇高潮一区二区三区99| 日韩激情久久| 久久婷婷麻豆| 亚洲久久久久久久| 色综合天天综合在线视频| 亚洲人视频在线观看| 久久频这里精品99香蕉| 8x国产一区二区三区精品推荐| 在线无限看免费粉色视频| 免费欧美日韩国产三级电影| 日本黄色特级片| 欧美性猛交xxxx久久久| 色在线免费视频| 日本国产一区二区三区| 在线日韩一区| 超碰网在线观看| 久久久久久久电影| 亚洲国产av一区二区三区| 亚洲片在线资源| 韩国成人在线| 亚洲图片欧洲图片日韩av| 蜜臀av一区二区在线观看| 一级二级黄色片| 欧美日韩mp4| av香蕉成人| yellow视频在线观看一区二区| 欧美黄污视频| 蜜臀视频在线观看| 色综合天天天天做夜夜夜夜做| 男人久久精品| 国产精品久久久久久久久免费 | jizzjizz国产精品喷水| 26uuu精品一区二区| 波多野结衣视频在线观看| 神马久久桃色视频| 欧美影院在线| 成人黄色av片| 国产人成一区二区三区影院| 在线观看日韩一区二区| www.日韩免费| 9l视频自拍蝌蚪9l视频成人| 北条麻妃69av| 国产精品久久久久婷婷二区次| 精品国自产在线观看| 欧美性受xxx| 成人一区而且| 国产成人精品一区二区三区在线观看 | 日韩天堂在线| 9l视频自拍9l视频自拍| kk眼镜猥琐国模调教系列一区二区| caoporn国产| 久久人人爽人人爽人人片亚洲| 狠狠久久伊人| 牛夜精品久久久久久久| 亚洲精品中文字幕在线观看| 婷婷五月综合激情| 成人福利网站在线观看11| 一区在线视频观看| 黄色av免费播放| 亚洲成人激情在线| 久久日本片精品aaaaa国产| 97久久国产亚洲精品超碰热| 久久久久久久网| 国产suv精品一区二区69| 日本国产欧美一区二区三区| 综合国产精品| www在线观看免费视频| 91精品国产综合久久精品| 午夜激情电影在线播放| 一本久道久久综合| 99re6这里只有精品视频在线观看| 中文字幕福利视频| 97av视频在线| 欧美 日韩 国产精品免费观看|