SpringCloud Alibaba微服务实战之 业务日志组件

架构 2023-07-05 17:29:38
29阅读

 

简述

在单个新项目中如果我们必须纪录实际操作日志一般会根据以下方式完成:

  • 创建一个自定义注解,标明业务流程实际操作种类
  • 根据AOP拼装日志实体线,进行日志的搜集工作中

实际完成能够参照以下的文章内容连接:

http://javadaily.cn/articles/2020/05/13/1589330750429.html

可是在分布式架构中大家不太可能每一个服务项目都写一个自定义注解,再写一个AOP,这很显著违背了 Don’t repeat yourself 精神实质。因此 此刻大家一般都是会创建一个公共性的部件,在公共性部件中进行日志的搜集,后端开发服务项目只必须引进这一公共性的部件就可以。

这就是今日文章内容的內容,单独的业务流程日志搜集部件。

SpringBoot Starter

要完成以上的作用大家必须依靠SringBoot Starter来完成,SpringBoot 的一大优点便是Starter,根据Starter我们可以封裝公共性的领域模型及其主要参数的复位,假如你一直在开展微服务架构开发设计,Starter的撰写是一定要把握的。

这儿大家简易提一下SpringBoot Starter完成自动化技术配备的步骤

  • spring-boot运行的情况下会寻找starterjar库中的resources/META-INF/spring.factories文档,依据spring.factories文档中的配备,寻找必须全自动配备的类,xxxAutoConfigure
  • 根据xxxAutoConfigure上的注释@EnableConfigurationProperties将当今控制模块的特性关联到「Environment」 上(若有)。
  • 根据xxxAutoConfigure中界定的bean自动组装到IOC器皿中。

实战演练

全过程以下:

最先我们在新项目中创建一个starter的module,如cloud-component-logging-starter

撰写配备类SysLogAutoConfigure

 
  1. @Configuration 
  2. public class SysLogAutoConfigure { 
  3.  
  4.     @Bean 
  5.     public SysLogAspect controllerLogAspect(){ 
  6.         return new SysLogAspect(); 
  7.     } 
  8.  

在SysLogAutoConfigure中大家引入了一个日志横切面SysLogAspect,因为日志搜集专用工具不用附加配备特性,因此 大家也就不用界定特性配备类了。

自定日志注释 SysLog

 
  1. @Target(ElementType.METHOD) 
  2. @Retention(RetentionPolicy.RUNTIME) 
  3. @Documented 
  4. public @interface SysLog { 
  5.  /** 
  6.   * 日志內容 
  7.   * @return {String} 
  8.   */ 
  9.  String value(); 

界定日志横切面 SysLogAspect

 
  1. @Aspect 
  2. public class SysLogAspect { 
  3.  
  4.     private final Logger log = LoggerFactory.getLogger(this.getClass()); 
  5.  
  6.     @Pointcut("@annotation(com.javadaily.component.logging.annotation.SysLog)"
  7.     public void logPointCut() { 
  8.  
  9.     } 
  10.  
  11.     @Around("logPointCut()"
  12.     public Object around(ProceedingJoinPoint pjp) throws Throwable { 
  13.         MethodSignature signature = (MethodSignature) pjp.getSignature(); 
  14.         Method method = signature.getMethod(); 
  15.        //类名 
  16.         String className = pjp.getTarget().getClass().getName(); 
  17.         //方式名 
  18.         String methodName = signature.getName(); 
  19.      
  20.         SysLog syslog = method.getAnnotation(SysLog.class); 
  21.         //实际操作 
  22.         String operator =syslog.value(); 
  23.  
  24.         long beginTime = System.currentTimeMillis(); 
  25.  
  26.         Object returnValue = null
  27.         Exception ex = null
  28.         try { 
  29.             returnValue = pjp.proceed(); 
  30.             return returnValue; 
  31.         } catch (Exception e) { 
  32.             ex = e; 
  33.             throw e; 
  34.         } finally { 
  35.             long cost = System.currentTimeMillis() - beginTime; 
  36.             if (ex != null) { 
  37.                 log.error("[class: {}][method: {}][operator: {}][cost: {}ms][args: {}][产生出现异常]"
  38.                         className, methodName, operator, pjp.getArgs(), ex); 
  39.             } else { 
  40.                 log.info("[class: {}][method: {}][operator: {}][cost: {}ms][args: {}][return: {}]"
  41.                         className, methodName, operator, cost, pjp.getArgs(), returnValue); 
  42.             } 
  43.         } 
  44.  
  45.     } 

上边的横切面表明,针对应用了@SysLog注释的方式全自动开展日志搜集,将日志键入到日志文档。

在resource/META-INF文件目录下创建spring.factories文档,载入配备类SysLogAutoConfigure

 
  1. org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ 
  2. com.javadaily.component.logging.configure.SysLogAutoConfigure 

在微服务架构中引进日志部件

 
  1. <dependency> 
  2.     <groupId>com.jianzh5.cloud</groupId> 
  3.     <artifactId>cloud-component-logging-starter</artifactId> 
  4.     <version>1.0.0</version> 
  5. </dependency> 

在必须开展日志搜集的方式上加上@SysLog注释

 
  1. @SysLog("搜索客户"
  2. public ResultData<AccountDTO> getByCode(@PathVariable(value = "accountCode") String accountCode){ 
  3.     log.warn("get account detail,accountCode is :{}",accountCode); 
  4.  
  5.     SecurityUser securityUser = SecurityUtils.getUser(); 
  6.     log.info(securityUser); 
  7.  
  8.     AccountDTO accountDTO = accountService.selectByCode(accountCode); 
  9.     return ResultData.success(accountDTO); 

总结

根据上边7步大家完成了日志搜集部件的自定Starter撰写,这儿很有可能有的老同学聚会问,在 SysLogAutoConfigure类中并不是拥有 @Configuration和 @Bean注释,这两个注释并不是能够全自动载入界定的Bean到IOC器皿吗?为何还必须根据在spring.factories文档中导进 SysLogAutoConfigure呢?

这是由于springboot新项目默认设置总是扫描仪本新项目下的带@Configuration注释的类,假如自定starter,没有本工程项目中,是没法载入的,因此 要配备META-INF/spring.factories环境变量,根据spring.factories来装车配备类。

【责编:武晓燕 TEL:(010)68476606】
关注点赞 0
the end
免责声明:本文不代表本站的观点和立场,如有侵权请联系本站删除!本站仅提供信息存储空间服务。