真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

springboot中怎么配置aop切面日志打印

springboot中怎么配置aop切面日志打印,針對(duì)這個(gè)問題,這篇文章詳細(xì)介紹了相對(duì)應(yīng)的分析和解答,希望可以幫助更多想解決這個(gè)問題的小伙伴找到更簡(jiǎn)單易行的方法。

創(chuàng)新互聯(lián)擁有一支富有激情的企業(yè)網(wǎng)站制作團(tuán)隊(duì),在互聯(lián)網(wǎng)網(wǎng)站建設(shè)行業(yè)深耕10年,專業(yè)且經(jīng)驗(yàn)豐富。10年網(wǎng)站優(yōu)化營(yíng)銷經(jīng)驗(yàn),我們已為成百上千家中小企業(yè)提供了網(wǎng)站制作、網(wǎng)站設(shè)計(jì)解決方案,按需求定制開發(fā),設(shè)計(jì)滿意,售后服務(wù)無憂。所有客戶皆提供一年免費(fèi)網(wǎng)站維護(hù)!

一、SpringBoot Aop說明

1. Aop

AOP(Aspect-Oriented Programming,面向切面編程),它利用一種”橫切”的技術(shù),將那些多個(gè)類的共同行為封裝到一個(gè)可重用的模塊。便于減少系統(tǒng)的重復(fù)代碼,降低模塊之間的耦合度,并有利于未來的可操作性和可維護(hù)性。

2. AOP相關(guān)概念:
Aspect(切面):聲明類似于Java中的類聲明,在Aspect中會(huì)包含一些Pointcut及相應(yīng)的Advice。

Joint point(連接點(diǎn)):表示在程序中明確定義的點(diǎn)。包括方法的調(diào)用、對(duì)類成員的訪問等。

Pointcut(切入點(diǎn)):表示一個(gè)組Joint point,如方法名、參數(shù)類型、返回類型等等。

Advice(通知):Advice定義了在Pointcut里面定義的程序點(diǎn)具體要做的操作,它通過(before、around、after(return、throw)、finally來區(qū)別實(shí)在每個(gè)Joint point之前、之后還是執(zhí)行 前后要調(diào)用的代碼。

Before:在執(zhí)行方法前調(diào)用Advice,比如請(qǐng)求接口之前的登錄驗(yàn)證。

Around:在執(zhí)行方法前后調(diào)用Advice,這是最常用的方法。

After:在執(zhí)行方法后調(diào)用Advice,after、return是方法正常返回后調(diào)用,after\throw是方法拋出異常后調(diào)用。

Finally:方法調(diào)用后執(zhí)行Advice,無論是否拋出異常還是正常返回。

AOP proxy:AOP proxy也是Java對(duì)象,是由AOP框架創(chuàng)建,用來完成上述動(dòng)作,AOP對(duì)象通??梢酝ㄟ^JDK dynamic proxy完成,或者使用CGLIb完成。

Weaving:實(shí)現(xiàn)上述切面編程的代碼織入,可以在編譯時(shí)刻,也可以在運(yùn)行時(shí)刻,Spring和其它大多數(shù)Java框架都是在運(yùn)行時(shí)刻生成代理。

二、代碼示例

1. POM引入


  
    org.springframework.boot
    spring-boot-starter-web
  
  
    org.springframework.boot
    spring-boot-starter-aop
  
  
  
    eu.bitwalker
    UserAgentUtils
    1.21
  
  
  
    org.projectlombok
    lombok
    1.18.10
  

2、切面:WebLogAspect代碼

/**
 * 添加aop日志打印
 *
 * @author 馬振全 2020/1/13 14:42
 */
@Aspect
@Component
@Slf4j
public class WebLogAspect {
  /**
   * 進(jìn)入方法時(shí)間戳
   */
  private Long startTime;
  /**
   * 方法結(jié)束時(shí)間戳(計(jì)時(shí))
   */
  private Long endTime;
 
  public WebLogAspect() {
  }
 
 
  /**
   * 定義請(qǐng)求日志切入點(diǎn),其切入點(diǎn)表達(dá)式有多種匹配方式,這里是指定路徑
   */
  @Pointcut("execution(public * com.soyoung.ad.engine.controller.*.*(..))")
  public void webLogPointcut() {
  }
 
  /**
   * 前置通知:
   * 1. 在執(zhí)行目標(biāo)方法之前執(zhí)行,比如請(qǐng)求接口之前的登錄驗(yàn)證;
   * 2. 在前置通知中設(shè)置請(qǐng)求日志信息,如開始時(shí)間,請(qǐng)求參數(shù),注解內(nèi)容等
   *
   * @param joinPoint
   * @throws Throwable
   */
  @Before("webLogPointcut()")
  public void doBefore(JoinPoint joinPoint) {
 
    // 接收到請(qǐng)求,記錄請(qǐng)求內(nèi)容
    ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
    HttpServletRequest request = attributes.getRequest();
    //獲取請(qǐng)求頭中的User-Agent
    UserAgent userAgent = UserAgent.parseUserAgentString(request.getHeader("User-Agent"));
    //打印請(qǐng)求的內(nèi)容
    startTime = System.currentTimeMillis();
    log.info("請(qǐng)求開始時(shí)間:{}", LocalDateTime.now());
    log.info("請(qǐng)求Url : {}", request.getRequestURL().toString());
    log.info("請(qǐng)求方式 : {}", request.getMethod());
    log.info("請(qǐng)求ip : {}", request.getRemoteAddr());
    log.info("請(qǐng)求方法 : ", joinPoint.getSignature().getDeclaringTypeName() + "." + joinPoint.getSignature().getName());
    log.info("請(qǐng)求參數(shù) : {}", Arrays.toString(joinPoint.getArgs()));
    // 系統(tǒng)信息
    log.info("瀏覽器:{}", userAgent.getBrowser().toString());
    log.info("瀏覽器版本:{}", userAgent.getBrowserVersion());
    log.info("操作系統(tǒng): {}", userAgent.getOperatingSystem().toString());
  }
 
  /**
   * 返回通知:
   * 1. 在目標(biāo)方法正常結(jié)束之后執(zhí)行
   * 1. 在返回通知中補(bǔ)充請(qǐng)求日志信息,如返回時(shí)間,方法耗時(shí),返回值,并且保存日志信息
   *
   * @param ret
   * @throws Throwable
   */
  @AfterReturning(returning = "ret", pointcut = "webLogPointcut()")
  public void doAfterReturning(Object ret) throws Throwable {
    endTime = System.currentTimeMillis();
    log.info("請(qǐng)求結(jié)束時(shí)間:{}", LocalDateTime.now());
    log.info("請(qǐng)求耗時(shí):{}", (endTime - startTime));
    // 處理完請(qǐng)求,返回內(nèi)容
    log.info("請(qǐng)求返回 : {}", ret);
  }
 
  /**
   * 異常通知:
   * 1. 在目標(biāo)方法非正常結(jié)束,發(fā)生異?;蛘邟伋霎惓r(shí)執(zhí)行
   * 1. 在異常通知中設(shè)置異常信息,并將其保存
   *
   * @param throwable
   */
  @AfterThrowing(value = "webLogPointcut()", throwing = "throwable")
  public void doAfterThrowing(Throwable throwable) {
    // 保存異常日志記錄
    log.error("發(fā)生異常時(shí)間:{}", LocalDateTime.now());
    log.error("拋出異常:{}", throwable.getMessage());
  }
}

3、@Before和@AfterReturning部分也可使用以下代碼替代

/**
 * 在執(zhí)行方法前后調(diào)用Advice,這是最常用的方法,相當(dāng)于@Before和@AfterReturning全部做的事兒
 * @param pjp
 * @return
 * @throws Throwable
 */
@Around("webLogPointcut()")
public Object doAround(ProceedingJoinPoint pjp) throws Throwable {
  // 接收到請(qǐng)求,記錄請(qǐng)求內(nèi)容
  ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
  HttpServletRequest request = attributes.getRequest();
  //獲取請(qǐng)求頭中的User-Agent
  UserAgent userAgent = UserAgent.parseUserAgentString(request.getHeader("User-Agent"));
  //打印請(qǐng)求的內(nèi)容
  startTime = System.currentTimeMillis();
  log.info("請(qǐng)求Url : {}" , request.getRequestURL().toString());
  log.info("請(qǐng)求方式 : {}" , request.getMethod());
  log.info("請(qǐng)求ip : {}" , request.getRemoteAddr());
  log.info("請(qǐng)求方法 : " , pjp.getSignature().getDeclaringTypeName() , "." , pjp.getSignature().getName());
  log.info("請(qǐng)求參數(shù) : {}" , Arrays.toString(pjp.getArgs()));
// 系統(tǒng)信息
  log.info("瀏覽器:{}", userAgent.getBrowser().toString());
  log.info("瀏覽器版本:{}",userAgent.getBrowserVersion());
  log.info("操作系統(tǒng): {}", userAgent.getOperatingSystem().toString());
  // pjp.proceed():當(dāng)我們執(zhí)行完切面代碼之后,還有繼續(xù)處理業(yè)務(wù)相關(guān)的代碼。proceed()方法會(huì)繼續(xù)執(zhí)行業(yè)務(wù)代碼,并且其返回值,就是業(yè)務(wù)處理完成之后的返回值。
  Object ret = pjp.proceed();
  log.info("請(qǐng)求結(jié)束時(shí)間:"+ LocalDateTime.now());
  log.info("請(qǐng)求耗時(shí):{}" , (System.currentTimeMillis() - startTime));
  // 處理完請(qǐng)求,返回內(nèi)容
  log.info("請(qǐng)求返回 : " , ret);
  return ret;
}

4、測(cè)試結(jié)果

2020-01-13 15:18:21.309 INFO xxx.WebLogAspect : 請(qǐng)求開始時(shí)間:2020-01-13T15:18:21.309
2020-01-13 15:18:21.309 INFO xxx.WebLogAspect : 請(qǐng)求Url : http://localhost:8020/api/v1/hourlyStat/findHourlyStatReportList
2020-01-13 15:18:21.320 INFO xxx.WebLogAspect : 請(qǐng)求方式 : POST
2020-01-13 15:18:21.321 INFO xxx.WebLogAspect : 請(qǐng)求ip : 0:0:0:0:0:0:0:1
2020-01-13 15:18:21.322 INFO xxx.WebLogAspect : 請(qǐng)求方法 : 
2020-01-13 15:18:21.325 INFO xxx.WebLogAspect : 請(qǐng)求參數(shù) : [HourlyStat{subStrategyId=null}]
2020-01-13 15:18:21.326 INFO xxx.WebLogAspect : 瀏覽器:CHROME
2020-01-13 15:18:21.327 INFO xxx.WebLogAspect : 瀏覽器版本:78.0.3904.108
2020-01-13 15:18:21.333 INFO xxx.WebLogAspect : 操作系統(tǒng): WINDOWS_10
2020-01-13 15:18:21.403 INFO xxx.WebLogAspect : 請(qǐng)求結(jié)束時(shí)間:2020-01-13T15:18:21.403
2020-01-13 15:18:21.405 INFO xxx.WebLogAspect : 請(qǐng)求耗時(shí):94
2020-01-13 15:18:21.405 INFO xxx.WebLogAspect : 請(qǐng)求返回 : com.soyoung.ad.engine.common.Result@2f935d03
2020-01-13 15:18:21.492 INFO xxx.WebLogAspect : 請(qǐng)求結(jié)束時(shí)間:2020-01-13T15:18:21.492
2020-01-13 15:18:21.493 INFO xxx.WebLogAspect : 請(qǐng)求耗時(shí):183
2020-01-13 15:18:21.494 INFO xxx.WebLogAspect : 請(qǐng)求返回 : com.soyoung.ad.engine.common.Result@7199e922
2020-01-13 15:18:42.859 INFO xxx.WebLogAspect : 請(qǐng)求開始時(shí)間:2020-01-13T15:18:42.859
2020-01-13 15:18:42.860 INFO xxx.WebLogAspect : 請(qǐng)求Url : http://localhost:8020/api/v1/hourlyStat/findHourlyStatReportList
2020-01-13 15:18:42.860 INFO xxx.WebLogAspect : 請(qǐng)求方式 : POST
2020-01-13 15:18:42.861 INFO xxx.WebLogAspect : 請(qǐng)求ip : 0:0:0:0:0:0:0:1
2020-01-13 15:18:42.861 INFO xxx.WebLogAspect : 請(qǐng)求方法 : 
2020-01-13 15:18:42.862 INFO xxx.WebLogAspect : 請(qǐng)求參數(shù) : [HourlyStat{subStrategyId=1003}]
2020-01-13 15:18:42.862 INFO xxx.WebLogAspect : 瀏覽器:CHROME
2020-01-13 15:18:42.863 INFO xxx.WebLogAspect : 瀏覽器版本:78.0.3904.108
2020-01-13 15:18:42.864 INFO xxx.WebLogAspect : 操作系統(tǒng): WINDOWS_10
2020-01-13 15:18:42.909 INFO xxx.WebLogAspect : 請(qǐng)求結(jié)束時(shí)間:2020-01-13T15:18:42.909
2020-01-13 15:18:42.910 INFO xxx.WebLogAspect : 請(qǐng)求耗時(shí):50
2020-01-13 15:18:42.910 INFO xxx.WebLogAspect : 請(qǐng)求返回 : com.soyoung.ad.engine.common.Result@7d494cbd

關(guān)于springboot中怎么配置aop切面日志打印問題的解答就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道了解更多相關(guān)知識(shí)。


本文題目:springboot中怎么配置aop切面日志打印
分享網(wǎng)址:http://weahome.cn/article/jdphsc.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部