亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

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

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

AOP如何實現打印接口日志

發布時間:2021-10-20 17:58:12 來源:億速云 閱讀:319 作者:柒染 欄目:大數據

AOP如何實現打印接口日志,針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。

接口日志有啥用

在我們日常的開發過程中,我們可以通過接口日志去查看這個接口的一些詳細信息。比如客戶端的IP,客戶端的類型,響應的時間,請求的類型,請求的接口方法等等,我們可以對這些數據進行統計分析,提取出我們想要的信息。

怎么拿到接口日志

這里,我們使用的是Spring的兩大殺器之AOP,通過在Controller層定義切點,然后對請求對象進行分析獲取接口信息,同時開啟一個ThreadLocal來記錄響應時間。

關于AOP的注解

  • @Aspect:將一個類定義為切面類。

  • @Pointcut:定義一個切入點。

  • @Before:在切入點開始處切入內容。

  • @After:在切入點結尾處切入內容。

  • @AfterReturning:在切入點返回內容之后切入內容(可以用來對處理返回值做一些加工處理。

  • @Around:在切入點前后切入內容,并自己控制何時執行切入點自身的內容

  • @AfterThrowing:用來處理當切入內容部分拋出異常之后的處理邏輯。

  • @Order:在切入點前的操作,按order的值由小到大執行;在切入點后的操作,按order的值由大到小執行。

實戰應用

一:引入依賴

首先,我們需要新增引入aop的依賴,以及用于分析客戶端信息的UserAgentUtils包,還有用于@Slf4j打印日志的Lombok的包:

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-aop</artifactId>
        </dependency>
        <dependency>
            <groupId>eu.bitwalker</groupId>
            <artifactId>UserAgentUtils</artifactId>
            <version>1.20</version>
        </dependency>
二:定義一個ResponseAop切面類

在之前的統一返回值和異常處理中我們已經定義過這個類,這里是對其進行完善。這里我再把代碼再寫一下:

@Aspect
@Order(5)
@Component
@Slf4j
public class ResponseAop
三:定義一個ThreadLocal變量

直接在這里定義基本類型會有同步問題,所以我們定義一個ThreadLocal對象來記錄消耗的時間。

ThreadLocal<Long> startTime = new ThreadLocal<>();
四:定義切點

這里需要注意的是切點的寫法,一定要正確才能保證AOP生效!這里附上一些簡單的寫法,后續會單獨開一章講解execution表達式的書寫。

  • 任意公共方法:
    execution(public * *(..))

  • 任何一個以“set”開始的方法的執行:
    execution(* set*(..))

  • Service接口的任意方法的執行:
    execution(* com.xyz.service.Service.*(..))

  • 定義在service包里的任意方法的執行:
    execution(* com.xyz.service..(..))

  • 定義在service包和所有子包里的任意類的任意方法的執行:
    execution(* com.xyz.service...(..))

    /**
     * 切點
     */
    @Pointcut("execution(public * indi.viyoung.viboot.*.controller..*(..))")
    public void httpResponse() {
    }
五:在@Before中獲取請求信息
@Before("httpResponse()")
    public void doBefore(JoinPoint joinPoint){
        //開始計時
        startTime.set(System.currentTimeMillis());
        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        HttpServletRequest request = attributes.getRequest();
        //打印請求的內容
        UserAgent userAgent = UserAgent.parseUserAgentString(request.getHeader("User-Agent"));//獲取請求頭中的User-Agent
        log.info("接口路徑:{}" , request.getRequestURL().toString());
        log.info("瀏覽器:{}", userAgent.getBrowser().toString());
        log.info("瀏覽器版本:{}",userAgent.getBrowserVersion());
        log.info("操作系統: {}", userAgent.getOperatingSystem().toString());
        log.info("IP : {}" , request.getRemoteAddr());
        log.info("請求類型:{}", request.getMethod());
        log.info("類方法 : " + joinPoint.getSignature().getDeclaringTypeName() + "." + joinPoint.getSignature().getName());
        log.info("請求參數 : {} " + Arrays.toString(joinPoint.getArgs()));
    }
六:在@AfterReturning中獲取方法的返回值和執行時間
    @AfterReturning(returning = "ret" , pointcut = "httpResponse()")
    public void doAfterReturning(Object ret){
        //處理完請求后,返回內容
        log.info("方法返回值:{}" , ret);
        log.info("方法執行時間:{}毫秒", (System.currentTimeMillis() - startTime.get()));
    }
七:測試結果

下面,我們對一個接口進行訪問:

2019-02-21 21:03:31.358  INFO 11788 --- [nio-8090-exec-5] indi.viyoung.viboot.aop.ResponseAop      : 接口路徑:http://localhost:8090/users
2019-02-21 21:03:31.359  INFO 11788 --- [nio-8090-exec-5] indi.viyoung.viboot.aop.ResponseAop      : 瀏覽器:CHROME
2019-02-21 21:03:31.359  INFO 11788 --- [nio-8090-exec-5] indi.viyoung.viboot.aop.ResponseAop      : 瀏覽器版本:72.0.3626.109
2019-02-21 21:03:31.360  INFO 11788 --- [nio-8090-exec-5] indi.viyoung.viboot.aop.ResponseAop      : 操作系統: MAC_OS_X
2019-02-21 21:03:31.360  INFO 11788 --- [nio-8090-exec-5] indi.viyoung.viboot.aop.ResponseAop      : IP : 0:0:0:0:0:0:0:1
2019-02-21 21:03:31.360  INFO 11788 --- [nio-8090-exec-5] indi.viyoung.viboot.aop.ResponseAop      : 請求類型:GET
2019-02-21 21:03:31.360  INFO 11788 --- [nio-8090-exec-5] indi.viyoung.viboot.aop.ResponseAop      : 類方法 : indi.viyoung.viboot.apilog.controller.UserController.findAll
2019-02-21 21:03:31.360  INFO 11788 --- [nio-8090-exec-5] indi.viyoung.viboot.aop.ResponseAop      : 請求參數 : {} []
...
2019-02-21 21:03:31.393  INFO 11788 --- [nio-8090-exec-5] indi.viyoung.viboot.aop.ResponseAop      : 方法返回值:ReturnVO{code='2000', message='操作成功', data=[User(id=10000001, password=123456, userName=vi-young), User(id=10000002, password=123456, userName=vi-young), User(id=10000003, password=123123, userName=lxt), User(id=10000004, password=123456, userName=yangwei)]}
2019-02-21 21:03:31.393  INFO 11788 --- [nio-8090-exec-5] indi.viyoung.viboot.aop.ResponseAop      : 方法執行時間:36毫秒

可以看出,我們已經獲取到我們想要的信息~

在后面的應用實戰中,我們會將這些信息保存到數據庫中,并且使用一些數據分析工具進行分析。

關于AOP如何實現打印接口日志問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。

向AI問一下細節

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

aop
AI

琼中| 贵定县| 湟中县| 衡水市| 宿州市| 桐城市| 漠河县| 绥江县| 滁州市| 固原市| 宁明县| 永寿县| 通辽市| 龙井市| 绍兴县| 沈丘县| 高陵县| 基隆市| 霸州市| 珲春市| 平原县| 建阳市| 西华县| 乾安县| 桐庐县| 阿克| 山阳县| 佛坪县| 凤冈县| 枣阳市| 峨边| 平果县| 武义县| 万州区| 肇庆市| 朝阳区| 长葛市| 军事| 泰和县| 格尔木市| 凤阳县|