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

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

SpringBoot2集成AOPLog來記錄接口訪問日志

前言

在陳倉等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強(qiáng)發(fā)展的系統(tǒng)性、市場前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供做網(wǎng)站、網(wǎng)站設(shè)計 網(wǎng)站設(shè)計制作定制網(wǎng)站開發(fā),公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),高端網(wǎng)站設(shè)計,成都全網(wǎng)營銷,成都外貿(mào)網(wǎng)站建設(shè),陳倉網(wǎng)站建設(shè)費用合理。

日志是一個Web項目中必不可少的部分,借助它我們可以做許多事情,比如問題排查、訪問統(tǒng)計、監(jiān)控告警等。一般通過引入slf4j的一些實現(xiàn)框架來做日志功能,如log4j,logback,log4j2,其性能也是依次增強(qiáng)。在springboot中,默認(rèn)使用的框架是logback。

我們經(jīng)常需要在方法開頭或結(jié)尾加日志記錄傳入?yún)?shù)或返回結(jié)果,以此來復(fù)現(xiàn)當(dāng)時的請求情況。但是手動添加日志,不僅繁瑣重復(fù),也影響代碼的美觀簡潔。本文引入一個基于AOP實現(xiàn)的日志框架,并通過spring-boot-starter的方式完成集成。

1. aop-logging項目

項目地址

該項目基于 , 在其基礎(chǔ)上添加了ReqId來串聯(lián)某次客戶端請求(參考com.github.nickvl.xspring.core.log.aop.ReqIdFilter), 添加了方法執(zhí)行時長(參考com.github.nickvl.xspring.core.log.aop.AOPLogger.logTheMethod方法中elapsedTime)。

該項目提供了基于注解的AOP日志功能。根據(jù)不同的日志級別,提供的注解有LogTrace,LogDebug,LogInfo,LogWarn,LogError,LogFatal,LogException,可修飾于類(等同于該類內(nèi)所有方法上添加)與方法上,前面六個分別表示在不同日志級別下記錄方法被調(diào)用的日志,LogException表示在方法拋出異常時,記錄相應(yīng)日志。

這些注解都提供了一個LogPoint枚舉類型的屬性value,取值{IN,OUT,BOTH},分別表示在方法調(diào)用入口、方法調(diào)用返回前,以及包含兩者的位置打印對應(yīng)日志,默認(rèn)為BOTH。

2. 集成

可可以通過基于xml或基于java配置的方式來集成AOP日志功能,我這里基于java配置(基于xml的方式參考源碼README文件)并且通過spring-boot-starter的形式進(jìn)行封裝(源碼地址),避免每個項目都需要配置。自動配置類如下

@Configuration
@ConditionalOnClass(AOPLogger.class)
@ConditionalOnMissingBean(AOPLogger.class)
public class AopLoggerAutoConfiguration {
  private static final boolean SKIP_NULL_FIELDS = true;
  private static final Set EXCLUDE_SECURE_FIELD_NAMES = Collections.emptySet();
  @Bean
  public AOPLogger aopLogger() {
    AOPLogger aopLogger = new AOPLogger();
    aopLogger.setLogAdapter(new UniversalLogAdapter(SKIP_NULL_FIELDS, EXCLUDE_SECURE_FIELD_NAMES));
    return aopLogger;
  }
  /**
  * 注冊一個過濾器,用來生成一個reqId,標(biāo)記一次請求,從而將本次請求所產(chǎn)生的日志串聯(lián)起來
  * @param
  * @return
  */
  @Bean
  public FilterRegistrationBean reqIdFilter() {
    ReqIdFilter reqIdFilter = new ReqIdFilter();
    FilterRegistrationBean registrationBean = new FilterRegistrationBean();
    registrationBean.setFilter(reqIdFilter);
    List urlPatterns = Collections.singletonList("/*");
    registrationBean.setUrlPatterns(urlPatterns);
    registrationBean.setOrder(100);
    return registrationBean;
  }
}

將基礎(chǔ)框架base-spring-boot通過mvn clean install進(jìn)行本地安裝后,即可在項目中通過依賴進(jìn)行引入(基礎(chǔ)框架中已在spring-boot-parent中引入,直接繼承亦可),如


cn.jboost.springboot
aoplog-spring-boot-starter
1.2-SNAPSHOT

3. 使用

引入依賴之后,我們再定義一個日志配置文件logback-spring.xml,為了后面方便地將日志導(dǎo)入ELK做集中的日志分析管理,該配置文件中將日志以json格式輸出,并根據(jù)日志級別分別寫入debug.log,info.log,warn.log,error.log以及interface.log(專用于接口訪問日志),配置示例如下(完整配置)


 ${logPath}/elk/interface.log
 
  
  
   
   {
   "project": "${projectName}",
   "timestamp": "%date{\"yyyy-MM-dd'T'HH:mm:ss,SSSZ\"}",
   "log_level": "%level",
   "thread": "%thread",
   "class_name": "%X{callingClass}",
   "class_method":"%X{callingMethod}",
   "line_number": null,
   "message": "%message",
   "stack_trace": "%exception{5}",
   "req_id": "%X{reqId}",
   "elapsed_time": "#asLong{%X{elapsedTime}}"
   }
   
  
  
 
 
  INFO
 
 
  ${logPath}/bak/interface.%d{yyyy-MM-dd}.log
  30
  1GB
 
 

為了將該日志配置文件可以不經(jīng)修改地達(dá)到復(fù)用,將一些參數(shù)配置外置了,故需在配置文件applicaiton.yml中配置如下參數(shù)

logger:
path: D:\logs #默認(rèn)當(dāng)前項目路徑下的logs目錄
level: info # 默認(rèn)info
apiPackage: cn.jboost.springboot.aoplog.controller #必須配置, api接口類所在包
rootPackage: cn.jboost.springboot #必須配置,項目根包,記錄該包內(nèi)各類通過slf4j輸出的日志

最后,直接在需要記錄訪問日志的接口類上加注解@LogInfo就行了,如

@RestController
@RequestMapping("test")
@LogInfo
public class AoplogTestController {
  @GetMapping
  public String test(@RequestParam String user){
    return "Hi " + user;
  }
}

注意:在pom.xml中默認(rèn)添加的spring-boot-maven-plugin下需要添加repackage的goal才能自動生成日志目錄與日志文件,如下所示


 
 
  org.springframework.boot
  spring-boot-maven-plugin
  
  
   
   repackage
   
  
  
 
 

啟動程序,調(diào)用@LogInfo標(biāo)注的接口類下的API時,可以看到控制臺有打印接口訪問日志,如執(zhí)行demo程序(源碼),調(diào)用  http://localhost:8080/test?user=jboost 時,控制臺打印日志如下

[2019-06-27 14:29:59] [INFO ] [http-nio-8080-exec-1] [cn.jboost.springboot.aoplog.controller.AoplogTestController:184] --calling: test(user=jboost)
[2019-06-27 14:29:59] [INFO ] [http-nio-8080-exec-1] [cn.jboost.springboot.aoplog.controller.AoplogTestController:189] --returning: test(1 arguments):Hi jboost

日志文件interface.log中打印日志如下,(其中req_id在本次請求的所有日志都相同,這樣就可以將一次請求的所有日志串聯(lián)起來,便于分析與定位問題;elapsed_time標(biāo)明了方法執(zhí)行時長,可用于接口性能監(jiān)測)

{"project":"aoplog-test","timestamp":"2019-06-27T14:29:59,030+0800","log_level":"INFO","thread":"http-nio-8080-exec-1","class_name":"cn.jboost.springboot.aoplog.controller.AoplogTestController","class_method":"test","line_number":null,"message":"calling: test(user=jboost)","stack_trace":"","req_id":"5d146267aa147904bc014e71","elapsed_time":null}
{"project":"aoplog-test","timestamp":"2019-06-27T14:29:59,036+0800","log_level":"INFO","thread":"http-nio-8080-exec-1","class_name":"cn.jboost.springboot.aoplog.controller.AoplogTestController","class_method":"test","line_number":null,"message":"returning: test(1 arguments):Hi jboost","stack_trace":"","req_id":"5d146267aa147904bc014e71","elapsed_time":2}

4. 總結(jié)

Web項目中經(jīng)常需要通過查看接口請求及返回參數(shù)來定位問題,手動編寫代碼打印顯得繁瑣而重復(fù)。使用aop-logging通過簡單的注解即可實現(xiàn)接口日志自動打印。本文介紹的方案與日志配置模板可直接用于實際項目開發(fā)。當(dāng)然,注解不僅可用于Controller層,也可以用于Service等其它層,但一般Controller層加上即可,避免日志打印過多。

本文示例項目源碼地址

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持創(chuàng)新互聯(lián)。


新聞名稱:SpringBoot2集成AOPLog來記錄接口訪問日志
瀏覽地址:http://weahome.cn/article/pdcsed.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部