SpringCloud Alibaba微服务实战三十一 - 业务日志组件

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: SpringCloud Alibaba微服务实战三十一 - 业务日志组件

概述


在单体项目中如果我们需要记录操作日志一般会通过如下手段实现:

  • 建立一个自定义注解,标注业务操作类型
  • 通过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实现自动化配置的流程

  1. spring-boot启动的时候会找到starterjar包中的resources/META-INF/spring.factories文件,根据spring.factories文件中的配置,找到需要自动配置的类,xxxAutoConfigure
  2. 通过xxxAutoConfigure上的注解@EnableConfigurationProperties将当前模块的属性绑定到「Environment」 上(若有)。
  3. 通过xxxAutoConfigure中定义的bean自动装配到IOC容器中。

实战


过程如下:

  1. 首先我们在项目中建立一个starter的module,如cloud-component-logging-starter
  2. 编写配置类SysLogAutoConfigure
@Configuration
public class SysLogAutoConfigure {
    @Bean
    public SysLogAspect controllerLogAspect(){
        return new SysLogAspect();
    }
}

在SysLogAutoConfigure中我们注入了一个日志切面SysLogAspect,由于日志收集工具不需要额外配置属性,所以我们也就不需要定义属性配置类了。

  1. 自定义日志注解 SysLog
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface SysLog {
 /**
  * 日志内容
  * @return {String}
  */
 String value();
}
  1. 定义日志切面 SysLogAspect
@Aspect
public class SysLogAspect {
    private final Logger log = LoggerFactory.getLogger(this.getClass());
    @Pointcut("@annotation(com.javadaily.component.logging.annotation.SysLog)")
    public void logPointCut() {
    }
    @Around("logPointCut()")
    public Object around(ProceedingJoinPoint pjp) throws Throwable {
        MethodSignature signature = (MethodSignature) pjp.getSignature();
        Method method = signature.getMethod();
       //类名
        String className = pjp.getTarget().getClass().getName();
        //方法名
        String methodName = signature.getName();
        SysLog syslog = method.getAnnotation(SysLog.class);
        //操作
        String operator =syslog.value();
        long beginTime = System.currentTimeMillis();
        Object returnValue = null;
        Exception ex = null;
        try {
            returnValue = pjp.proceed();
            return returnValue;
        } catch (Exception e) {
            ex = e;
            throw e;
        } finally {
            long cost = System.currentTimeMillis() - beginTime;
            if (ex != null) {
                log.error("[class: {}][method: {}][operator: {}][cost: {}ms][args: {}][发生异常]",
                        className, methodName, operator, pjp.getArgs(), ex);
            } else {
                log.info("[class: {}][method: {}][operator: {}][cost: {}ms][args: {}][return: {}]",
                        className, methodName, operator, cost, pjp.getArgs(), returnValue);
            }
        }
    }
}

上面的切面表示,对于使用了@SysLog注解的方法自动进行日志收集,将日志输入到日志文件。

  1. 在resource/META-INF目录下建立spring.factories文件,加载配置类SysLogAutoConfigure
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.javadaily.component.logging.configure.SysLogAutoConfigure
  1. 在微服务中引入日志组件
<dependency>
    <groupId>com.jianzh5.cloud</groupId>
    <artifactId>cloud-component-logging-starter</artifactId>
    <version>1.0.0</version>
</dependency>
  1. 在需要进行日志收集的方法上添加@SysLog注解
@SysLog("查找用户")
public ResultData<AccountDTO> getByCode(@PathVariable(value = "accountCode") String accountCode){
    log.warn("get account detail,accountCode is :{}",accountCode);
    SecurityUser securityUser = SecurityUtils.getUser();
    log.info(securityUser);
    AccountDTO accountDTO = accountService.selectByCode(accountCode);
    return ResultData.success(accountDTO);
}


小结


通过上面7步我们完成了日志收集组件的自定义Starter编写,这里可能有的同学会问,在 SysLogAutoConfigure类中不是有了 @Configuration@Bean注解,这两个注解不是可以自动加载定义的Bean到IOC容器吗?为什么还需要通过在spring.factories文件中导入 SysLogAutoConfigure呢?

这是因为springboot项目默认只会扫描本项目下的带@Configuration注解的类,如果自定义starter,不在本工程中,是无法加载的,所以要配置META-INF/spring.factories配置文件,通过spring.factories来装载配置类。


以上,希望对你有所帮助!

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
2月前
|
存储 JavaScript 开发工具
基于HarmonyOS 5.0(NEXT)与SpringCloud架构的跨平台应用开发与服务集成研究【实战】
本次的.HarmonyOS Next ,ArkTS语言,HarmonyOS的元服务和DevEco Studio 开发工具,为开发者提供了构建现代化、轻量化、高性能应用的便捷方式。这些技术和工具将帮助开发者更好地适应未来的智能设备和服务提供方式。
75 8
基于HarmonyOS 5.0(NEXT)与SpringCloud架构的跨平台应用开发与服务集成研究【实战】
|
2月前
|
存储 监控 供应链
微服务拆分的 “坑”:实战复盘与避坑指南
本文回顾了从2~3人初创团队到百人技术团队的成长历程,重点讨论了从传统JSP到前后端分离+SpringCloud微服务架构的演变。通过实际案例,总结了微服务拆分过程中常见的两个问题:服务拆分边界不清晰和拆分粒度过细,并提出了优化方案,将11个微服务优化为6个,提高了系统的可维护性和扩展性。
66 0
|
2月前
|
存储 运维 数据可视化
如何为微服务实现分布式日志记录
如何为微服务实现分布式日志记录
137 1
|
3月前
|
Java Maven Spring
超实用的SpringAOP实战之日志记录
【11月更文挑战第11天】本文介绍了如何使用 Spring AOP 实现日志记录功能。首先概述了日志记录的重要性及 Spring AOP 的优势,然后详细讲解了搭建 Spring AOP 环境、定义日志切面、优化日志内容和格式的方法,最后通过测试验证日志记录功能的准确性和完整性。通过这些步骤,可以有效提升系统的可维护性和可追踪性。
|
3月前
|
监控 负载均衡 Java
5 大 SpringCloud 核心组件详解,8 张图彻底弄懂
本文图文详解 Spring Cloud 的五大核心组件,帮助深入理解和掌握微服务架构。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
5 大 SpringCloud 核心组件详解,8 张图彻底弄懂
|
3月前
|
JSON Java 测试技术
SpringCloud2023实战之接口服务测试工具SpringBootTest
SpringBootTest同时集成了JUnit Jupiter、AssertJ、Hamcrest测试辅助库,使得更容易编写但愿测试代码。
92 3
|
3月前
|
负载均衡 算法 Java
除了 Ribbon,Spring Cloud 中还有哪些负载均衡组件?
这些负载均衡组件各有特点,在不同的场景和需求下,可以根据项目的具体情况选择合适的负载均衡组件来实现高效、稳定的服务调用。
225 5
|
3月前
|
运维 NoSQL Java
后端架构演进:微服务架构的优缺点与实战案例分析
【10月更文挑战第28天】本文探讨了微服务架构与单体架构的优缺点,并通过实战案例分析了微服务架构在实际应用中的表现。微服务架构具有高内聚、低耦合、独立部署等优势,但也面临分布式系统的复杂性和较高的运维成本。通过某电商平台的实际案例,展示了微服务架构在提升系统性能和团队协作效率方面的显著效果,同时也指出了其带来的挑战。
120 4
|
3月前
|
消息中间件 存储 监控
微服务日志监控的挑战及应对方案
【10月更文挑战第23天】微服务化带来模块独立与快速扩展,但也使得日志监控复杂。日志作用包括业务记录、异常追踪和性能定位。
|
4月前
|
Java 程序员 应用服务中间件
「测试线排查的一些经验-中篇」&& 调试日志实战
「测试线排查的一些经验-中篇」&& 调试日志实战
52 1
「测试线排查的一些经验-中篇」&& 调试日志实战