SpringCloudAlibaba2021微服务实战⼆⼗业务⽇志处理,starter
实战
SpringCloud Alibaba微服务实战之业务⽇志组件
要实现上述的功能我们需要借助SringBoot Starter来实现,SpringBoot 的⼀⼤优势就是Starter,通过Starter我们可以封装公共的业务逻辑以及参数的初始化,如果你在进⾏微服务开发,Starter的编写是⼀定要掌握的。
概述
前⾯我们通过gateway记录了请求响应⽇志信息,但对某个业务场景记录更确切的⽇志,我们要编写通⽤的⼀个组件来处理。⽇志如何处理,根据业务要求合理处理⽇志,这⾥只提供⼀个处理的思路,细化不再处理。.
在单体项⽬中如果我们需要记录操作⽇志⼀般会通过如下⼿段实现:
建⽴⼀个⾃定义注解,标注业务操作类型
通过AOP组装⽇志实体,完成⽇志的收集⼯作
但是在微服务架构中我们不可能每个服务都写⼀个⾃定义注解,再写⼀个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.
9. }
在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();
10. }
定义⽇志切⾯ SysLogAspect
1. @Aspect
2. public class SysLogAspect {
3.
4.    private final Logger log = Class());
5.
6.    @Pointcut("@annotation(com.javadailyponent.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) Signature();
14.        Method method = Method();
15.        //类名
16.        String className = Target().getClass().getName();
17.        //⽅法名
18.        String methodName = Name();
19.
20.        SysLog syslog = Annotation(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.                ("[class: {}][method: {}][operator: {}][cost: {}ms][args: {}][发⽣异常]",
38.                        className, methodName, operator, Args(), ex);
39.            } else {
40.                log.info("[class: {}][method: {}][operator: {}][cost: {}ms][args: {}][return: {}]",
41.                        className, methodName, operator, cost, Args(), returnValue);
42.            }
43.        }
44.
45.    }
46. }
上⾯的切⾯表⽰,对于使⽤了@SysLog注解的⽅法⾃动进⾏⽇志收集,将⽇志输⼊到⽇志⽂件。
在resource/META-INF⽬录下建⽴spring.factories⽂件,加载配置类SysLogAutoConfigure
1. org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
2. com.figure.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 = User();
6.    log.info(securityUser);
7.
8.    AccountDTO accountDTO = accountService.selectByCode(accountCode);
9.    return ResultData.success(accountDTO);
spring ioc注解10. }
⼩结
通过上⾯7步我们完成了⽇志收集组件的⾃定义Starter编写,这⾥可能有的同学会问,在 SysLogAutoConfigure类中不是有了
@Configuration和 @Bean注解,这两个注解不是可以⾃动加载定义的Bean到IOC容器吗?为什么还需要通过在spring.factories⽂件中导⼊ SysLogAutoConfigure呢?
这是因为springboot项⽬默认只会扫描本项⽬下的带@Configuration注解的类,如果⾃定义starter,不在本⼯程中,是⽆法加载的,所以要配置META-INF/spring.factories配置⽂件,通过spring.factories来装载配置类。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。