亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

Spring Boot 2.x(十一):AOP實(shí)戰(zhàn)--打印接口日志

Youngdze / 2995人閱讀

摘要:接口日志有啥用在我們?nèi)粘5拈_發(fā)過程中,我們可以通過接口日志去查看這個(gè)接口的一些詳細(xì)信息。在切入點(diǎn)返回內(nèi)容之后切入內(nèi)容可以用來對(duì)處理返回值做一些加工處理。

接口日志有啥用

在我們?nèi)粘5拈_發(fā)過程中,我們可以通過接口日志去查看這個(gè)接口的一些詳細(xì)信息。比如客戶端的IP,客戶端的類型,響應(yīng)的時(shí)間,請(qǐng)求的類型,請(qǐng)求的接口方法等等,我們可以對(duì)這些數(shù)據(jù)進(jìn)行統(tǒng)計(jì)分析,提取出我們想要的信息。

怎么拿到接口日志

這里,我們使用的是Spring的兩大殺器之AOP,通過在Controller層定義切點(diǎn),然后對(duì)請(qǐng)求對(duì)象進(jìn)行分析獲取接口信息,同時(shí)開啟一個(gè)ThreadLocal來記錄響應(yīng)時(shí)間。

關(guān)于AOP的注解

@Aspect:將一個(gè)類定義為切面類。

@Pointcut:定義一個(gè)切入點(diǎn)。

@Before:在切入點(diǎn)開始處切入內(nèi)容。

@After:在切入點(diǎn)結(jié)尾處切入內(nèi)容。

@AfterReturning:在切入點(diǎn)返回內(nèi)容之后切入內(nèi)容(可以用來對(duì)處理返回值做一些加工處理。

@Around:在切入點(diǎn)前后切入內(nèi)容,并自己控制何時(shí)執(zhí)行切入點(diǎn)自身的內(nèi)容

@AfterThrowing:用來處理當(dāng)切入內(nèi)容部分拋出異常之后的處理邏輯。

@Order:在切入點(diǎn)前的操作,按order的值由小到大執(zhí)行;在切入點(diǎn)后的操作,按order的值由大到小執(zhí)行。

實(shí)戰(zhàn)應(yīng)用 一:引入依賴

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

        
            org.springframework.boot
            spring-boot-starter-aop
        
        
            eu.bitwalker
            UserAgentUtils
            1.20
        
二:定義一個(gè)ResponseAop切面類

在之前的統(tǒng)一返回值和異常處理中我們已經(jīng)定義過這個(gè)類,這里是對(duì)其進(jìn)行完善。這里我再把代碼再寫一下:

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

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

ThreadLocal startTime = new ThreadLocal<>();
四:定義切點(diǎn)

這里需要注意的是切點(diǎn)的寫法,一定要正確才能保證AOP生效!這里附上一些簡單的寫法,后續(xù)會(huì)多帶帶開一章講解execution表達(dá)式的書寫。

任意公共方法:

execution(public * *(..))

任何一個(gè)以“set”開始的方法的執(zhí)行:

execution(* set*(..))

Service接口的任意方法的執(zhí)行:

execution(* com.xyz.service.Service.*(..))

定義在service包里的任意方法的執(zhí)行:

execution(* com.xyz.service.*.*(..))

定義在service包和所有子包里的任意類的任意方法的執(zhí)行:

execution(* com.xyz.service..*.*(..))

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

下面,我們對(duì)一個(gè)接口進(jìn)行訪問:

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      : 操作系統(tǒng): 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      : 請(qǐng)求類型: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      : 請(qǐng)求參數(shù) : {} []
...
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      : 方法執(zhí)行時(shí)間:36毫秒

可以看出,我們已經(jīng)獲取到我們想要的信息~

在后面的應(yīng)用實(shí)戰(zhàn)中,我們會(huì)將這些信息保存到數(shù)據(jù)庫中,并且使用一些數(shù)據(jù)分析工具進(jìn)行分析。

公眾號(hào)

您的推薦是對(duì)我最大的幫助!

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/75858.html

相關(guān)文章

  • SpringBoot 實(shí)戰(zhàn) (十一) | 整合數(shù)據(jù)緩存 Cache

    摘要:前言如題,今天介紹的數(shù)據(jù)緩存。說明確實(shí)做了數(shù)據(jù)緩存,第二次的測(cè)試結(jié)果是從數(shù)據(jù)緩存中獲取的,并沒有直接查數(shù)據(jù)庫。為為的數(shù)據(jù)做了緩存插入數(shù)據(jù)返回的結(jié)果數(shù)據(jù)庫中的結(jié)果訪問結(jié)果如下圖。后語以上為數(shù)據(jù)緩存的教程。 微信公眾號(hào):一個(gè)優(yōu)秀的廢人如有問題或建議,請(qǐng)后臺(tái)留言,我會(huì)盡力解決你的問題。 前言 如題,今天介紹 SpringBoot 的數(shù)據(jù)緩存。做過開發(fā)的都知道程序的瓶頸在于數(shù)據(jù)庫,我們也知道內(nèi)...

    idealcn 評(píng)論0 收藏0
  • SpringBoot 2.X Kotlin系列之AOP統(tǒng)一打印日志

    showImg(https://segmentfault.com/img/remote/1460000018819338?w=1024&h=500); 在開發(fā)項(xiàng)目中,我們經(jīng)常會(huì)需要打印日志,這樣方便開發(fā)人員了解接口調(diào)用情況及定位錯(cuò)誤問題,很多時(shí)候?qū)τ贑ontroller或者是Service的入?yún)⒑统鰠⑿枰蛴∪罩?,但是我們又不想重?fù)的在每個(gè)方法里去使用logger打印,這個(gè)時(shí)候希望有一個(gè)管理者統(tǒng)一...

    Nino 評(píng)論0 收藏0
  • [開源作品] skadmin 管理系統(tǒng)

    摘要:簡介項(xiàng)目基于的前后端分離的管理系統(tǒng),項(xiàng)目采用分模塊開發(fā)方式,權(quán)限控制采用,基于角色的訪問控制,支持?jǐn)?shù)據(jù)字典數(shù)據(jù)權(quán)限管理前端菜單支持動(dòng)態(tài)路由,另外還有其他的功能模塊日志管理代碼生成器系統(tǒng)監(jiān)控云存儲(chǔ)管理系統(tǒng)工具等等。 簡介 項(xiàng)目基于 Spring Boot 2.1.0 、 Spring Data JPA、 Spring Security、Redis、Vue的前后端分離的管理系統(tǒng),項(xiàng)目采用分...

    codergarden 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<