最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

使用Java實現(xiàn)接口攔截器來監(jiān)控接口的執(zhí)行情況

 更新時間:2024年01月30日 08:16:11   作者:源碼超級聯(lián)盟  
在排查問題的時候,由于沒有對接口的執(zhí)行情況,以及入?yún)⑦M行監(jiān)控,所以排查起問題就特別費勁,今天我們就一起來寫一個接口的攔截器來監(jiān)控接口的執(zhí)行情況吧

在工作中,我們往往會遇到一些接口的報錯,在排查問題的時候,由于沒有對接口的執(zhí)行情況,以及入?yún)⑦M行監(jiān)控,所以排查起問題就特別費勁,今天我們就一起來寫一個接口的攔截器。

@Slf4j
@Aspect
@Component
public class LogAspect {

    @SneakyThrows
    @Around("execution(* cn.com.alliance.we.controller..*(..))")
    public Object doAround(ProceedingJoinPoint pjp){
        // 創(chuàng)造計時器
        Stopwatch stWatch = Stopwatch.createStarted();
        //獲取請求信息
        ServletRequestAttributes sra = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        HttpServletRequest request = sra.getRequest();
        String tenantId = "unknown";
        try {
            tenantId = TenantContextHolder.getTenantId().toLowerCase(Locale.ROOT);
        }catch (Exception e){
            log.error("LogAspect獲取租戶異常:", e);
        }
        //獲取請求地址
        String requestURI = request.getRequestURI();
        //組合請求參數(shù),進行日志打印
        Object[] objects = pjp.getArgs();
        Object[] arguments  = new Object[objects.length];
        for (int i = 0; i < objects.length; i++) {
            if (objects[i] instanceof ServletRequest || objects[i] instanceof ServletResponse || objects[i] instanceof MultipartFile) {
                //過濾掉不能序列化的參數(shù)
                continue;
            }
            arguments[i] = objects[i];
        }
        //獲取登錄信息
        OcManageUser currentUserOrNull = OcManageUserContext.getCurrentUserOrNull();
        String currentOrgCode = "Unknown";
        String currentEmpCode = "Unknown";
        if(currentUserOrNull != null){
            currentOrgCode = currentUserOrNull.getOrgCode();
            currentEmpCode = currentUserOrNull.getEmpCode();
        }
        Object result = null;
        try {
            result = pjp.proceed();
            //請求操作成功
            String resultJosnString = "";
            if (result != null) {
                try{
                    resultJosnString = JsonUtil.bean2Json(result);
                }catch (Exception e){
                    resultJosnString = String.valueOf(result);
                }
            }
            //記錄請求完成執(zhí)行時間:
            long usedTime = stWatch.elapsed(TimeUnit.MILLISECONDS);
            //記錄日志
            if (log.isInfoEnabled()) {
                log.info("URI信息:{},租戶:{},登錄人:{},登錄網(wǎng)點:{}, 耗時:{},請求參數(shù):{}, 響應(yīng)參數(shù):{}", v("requestURI", requestURI),tenantId,currentEmpCode,currentOrgCode, v("elapsed", usedTime), JsonUtil.bean2Json(arguments), resultJosnString);
            }
            return result;
        }catch (Throwable et){
            //請求異常操作
            //記錄請求完成執(zhí)行時間:
            long usedTime = stWatch.elapsed(TimeUnit.MILLISECONDS);
            //記錄日志
            log.error("URI信息:{},租戶:{},登錄人:{},登錄網(wǎng)點:{}, 耗時:{},請求參數(shù):{}, 響應(yīng)異常信息:", v("requestURI", requestURI),tenantId,currentEmpCode,currentOrgCode, v("elapsed", usedTime), JsonUtil.bean2Json(arguments), et);
            throw et;
        }
    }

}

寫這么一個攔截器并不復(fù)雜,主要的還是需要注意一些細節(jié),比如過濾掉一些不能序列化的參數(shù);還有就是可以根據(jù)自己的需要,將請求頭的參數(shù)也打印出來。

到此這篇關(guān)于使用Java實現(xiàn)接口攔截器來監(jiān)控接口的執(zhí)行情況的文章就介紹到這了,更多相關(guān)Java接口攔截器內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 詳解記錄Java Log的幾種方式

    詳解記錄Java Log的幾種方式

    很多小伙伴不知道如何記錄日志,今天特地整理了本篇文章,文中有非常詳細的介紹及代碼示例,對小伙伴們很有幫助,需要的朋友可以參考下
    2021-06-06
  • java日期時間格式化@JsonFormat與@DateTimeFormat的使用

    java日期時間格式化@JsonFormat與@DateTimeFormat的使用

    本文主要介紹了java日期時間格式化@JsonFormat與@DateTimeFormat的使用,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08
  • @feignclient名字沖突的解決方案

    @feignclient名字沖突的解決方案

    這篇文章主要介紹了@feignclient名字沖突的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • 詳解SpringBoot如何統(tǒng)一后端返回格式

    詳解SpringBoot如何統(tǒng)一后端返回格式

    今天我們來聊一聊在基于SpringBoot前后端分離開發(fā)模式下,如何友好的返回統(tǒng)一的標準格式以及如何優(yōu)雅的處理全局異常,感興趣的可以了解一下
    2021-07-07
  • 基于parameters參數(shù)實現(xiàn)參數(shù)化過程解析

    基于parameters參數(shù)實現(xiàn)參數(shù)化過程解析

    這篇文章主要介紹了基于parameters參數(shù)實現(xiàn)參數(shù)化過程解析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-08-08
  • Java線程中的ThreadLocal原理及源碼解析

    Java線程中的ThreadLocal原理及源碼解析

    這篇文章主要介紹了Java線程中的ThreadLocal原理及源碼解析,ThreadLocal 的作用是為每個線程保存一份局部變量的引用,實現(xiàn)多線程之間的數(shù)據(jù)隔離,從而避免了線程不安全情況的發(fā)生,需要的朋友可以參考下
    2023-12-12
  • springcloud ribbon 饑餓加載原理解析

    springcloud ribbon 饑餓加載原理解析

    這篇文章主要介紹了springcloud ribbon 饑餓加載原理解析,饑餓加載特別適用于對啟動性能要求較高的場景,如系統(tǒng)啟動初期就有高并發(fā)請求的情況,感興趣的朋友跟隨小編一起學(xué)習(xí)吧
    2024-04-04
  • springboot項目連接多種數(shù)據(jù)庫該如何操作詳析

    springboot項目連接多種數(shù)據(jù)庫該如何操作詳析

    在Spring Boot應(yīng)用中連接多個數(shù)據(jù)庫或數(shù)據(jù)源可以使用多種方式,下面這篇文章主要給大家介紹了關(guān)于springboot項目連接多種數(shù)據(jù)庫該如何操作的相關(guān)資料,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2024-08-08
  • springboot使用@Slf4j進行日志的記錄步驟詳解

    springboot使用@Slf4j進行日志的記錄步驟詳解

    這篇文章主要介紹了springboot使用@Slf4j進行日志的記錄,使用@Slf4j的注解進行日志記錄非常方便,本文給大家分享操作步驟,需要的朋友可以參考下
    2023-08-08
  • Java?Base64?加密與解密示例代碼

    Java?Base64?加密與解密示例代碼

    基本的加密盡量保持簡單,加密輸入字符串沒有增加任何換行符。輸出被映射到“A-Za-z0-9+/”字符集中,解密從該字符集中解析為任意字符,這篇文章主要介紹了Java?Base64?加密與解密,需要的朋友可以參考下
    2022-12-12

最新評論

德庆县| 平南县| 梧州市| 敦煌市| 阿克苏市| 新沂市| 东光县| 南郑县| 昌江| 铜鼓县| 溧水县| 梅河口市| 五莲县| 芮城县| 美姑县| 睢宁县| 文登市| 金川县| 友谊县| 新平| 洞口县| 新河县| 阿坝县| 竹北市| 长沙县| 聂拉木县| 确山县| 汕尾市| 扶绥县| 塘沽区| 澜沧| 山东| 诸暨市| 施甸县| 枝江市| 海门市| 报价| 丹凤县| 吉隆县| 定南县| 天门市|