2025年springcloud aop日志(springcloud日志中心)

springcloud aop日志(springcloud日志中心)作者 AI 全栈程序猿来源 今日头条 针对业务开发人员通常面对的业务需求 我们将日志分为操作 请求 日志和系统运行日志 操作 请求 日志可以让管理员或者运营人员方便简单的在系统界面中查询追踪用户具体做了哪些操作 便于分析统计用户行为 系统运行日志又分为不同的级别 Log4j2 OFF gt FATAL gt ERROR gt WARN gt

大家好,我是讯享网,很高兴认识大家。



针对业务开发人员通常面对的业务需求,我们将日志分为操作(请求)日志和系统运行日志,操作(请求)日志可以让管理员或者运营人员方便简单的在系统界面中查询追踪用户具体做了哪些操作,便于分析统计用户行为;系统运行日志又分为不同的级别(Log4j2): OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL,这些日志级别由开发人员在代码编写时确定,并编写在代码中,系统运行时记录,方便系统开发人员分析定位解决问题,查找系统性能瓶颈。

我们可以自定义注解利用AOP拦截Controller请求实现系统(日志)操作日志的记录,系统运行日志可以使用Log4j2或者Logback。在SpringCloud微服务架构下,可以使用Gateway统一记录操作(请求)日志,由于微服务分布式集群部署,同一服务也存在多个,这里的日志追踪就需要借助Skywalking和ELK来实现具体的追踪分析记录。

由于最近爆发的Log4j2和Logback的漏洞问题,请选择最新修复漏洞的版本。根据网上很多性能的对比,Log4j2显著优于Logback,所以我们将SpringBoot默认的日志Logback修改为Log4j2。

在框架设计时,我们尽可能地考虑到日志系统的使用场景,将日志系统实现方式设计为可动态配置的,然后具体根据业务需求,选择使用合适的日志系统,根据常用业务需求,我们暂将微服务日志系统以如下方式实现:

操作日志:

  • 使用AOP特性,自定义注解拦截Controller请求实现系统操作日志
  • 优势:实现简单,通过注解即实现记录操作日志。缺点:需要硬编码到代码中,灵活性差。
  • 在网关Gateway通过读取配置,统一记录操作日志
  • 优势:可配置,实时更改需要记录哪些操作日志。缺点:配置实现稍复杂。

操作日志分为两种实现方式,各有优劣,不管哪种实现方式,日志记录都通过Log4j2来记录,通过Log4j2的配置,可动态选择记录到文件、关系型数据库MySQL、NoSQL数据库MongoDB、消息中间件Kafka等。

系统日志:

  • Log4j2记录日志,ELK采集分析展示

系统日志我们就采取通用的日志记录方式即可,通过Log4j2记录到日志文件,在通过ELK采集分析展示。

下面是具体实现步骤:

一、配置SkyWalking+Log4j2打印链路追踪TraceId

很早之前,大家最常用的Java日志记录工具是log4j,后来由log4j的创始人设计了另外一款日志记录工具logback,它比log4j更加优秀,详细对比可参照官方说明,所以SpringBoot默认使用logback作为日志记录工具。近年来Apache对Log4j进行了升级,推出了log4j2版本,无论从设计还是性能方面都优于log4j和logback,详细对比可自行测试,网上也有相应的测试报告,这里不详细说明。所以,我们肯定需要选择目前最合适的日志记录工具。

1、将SpringBoot默认日志Logback修改为Log4j2

排除spring-boot-starter-web等依赖的logback

引入

spring-boot-starter-log4j2依赖,因为对应版本的SpringBoot引入的Log4j2版本漏洞问题,这里排除默认log4j2版本,引入最新的修复漏洞版本。

引入log4j2修复漏洞版本的依赖

因为在SpringBoot中存在很多子依赖,以及在jar包中存在其他依赖logback的jar包,这里需要使用Maven工具来定位查找这些依赖Logback的jar包,逐一排除掉。在工程文件夹下执行Maven命令:

「SpringCloud」Spring Cloud 微服务日志系统设计与实-鸿蒙开发者社区
讯享网

如上图所示都是依赖logback的jar包,需要都排除,否则会和log4j2冲突。

2、集成可打印SkyWalking链路追踪TraceId的依赖

3、Log4j2配置实例

配置自己需要的log4j2.xml,在Pattern中配置[%traceId]可以显示链路追踪ID, 如果要读取springboot中yaml的配置,一定要引入log4j-spring-boot依赖。

4、IDEA控制台显示彩色日志

在上面Log4j2.xml中*LOG_PATTERN的配置已经设置了,每种日志显示同的颜色,在IDEA中默认没有效果,这里需要设置一下:点击右上角运行窗口的Edit Configurations,在VM options中添加-Dlog4j.skipJansi=false ,再次运行,就可以看到IDEA控制台显示彩色日志了。

二、自定义扩展日志级别,实现可配置的日志存取方式

虽然Log4j2提供了将日志保存到MySQL、MongoDB等,但是这里并不建议直接使用Log4j2将日志保存到MySQL、MongoDB等数据库,这样做不但在每个微服务引入Log4j2组件的时候,增加数据库链接池数量(不要考虑复用业务系统已有的数据库连接池,因为不是每个微服务都要有日志表),还有在高并发的情况下,对于整个业务系统来说这将是致命的问题。如果考虑到项目系统访问和操作很少,为了降低系统维护的复杂度,避免引入过多组件和环境,使用这种方式的话,那么就需要考虑业务系统是否需要使用微服务架构的问题了。

在高并发等情况下,我们推荐有两种方式来记录操作日志:一是将日志先保存到消息队列,作为数据库的一个缓冲,由消费者分批将日志数据保存到数据库,降低耦合,尽量使日志的操作不影响业务操作;二是使用Log4j2的异步文件日志,配合搭建ELK日志采集分析系统,来实现保存操作日志功能。

1、自定义操作日志和接口访问日志级别

默认的日志记录级别不能够满足我们记录操作日志和接口日志的需求,这里我们自己扩展Log4j2的日志级别来实现自定义的操作日志和接口日志。

新建LogLevelConstant定义日志级别

这里需要注意在使用日志时,需要使用@Log4j2注解而不是@Slf4j,因为@Slf4j默认提供的方法不能设置日志级别,测试代码:

2、自定义操作日志注解

在记录操作日志时,我们可能不需要在代码中直接写记录日志的代码,这里可以自定义注解,通过注解来实现操作日志的记录。首先根据Spring AOP的特性自定义三类日志记录类型、BeforeLog(执行方法之前)AfterLog(执行方法之后)、AroundLog(执行前和执行后)

BeforeLog

AfterLog

AroundLog

上面自定义注解之后,再编写LogAspect日志记录的切面实现

上面代码工作完成之后,接下来需要在log4j2.xml中配置自定义日志级别,实现将自定义的日志打印到指定的文件中:

3、实现将日志保存到Kafka

前面的配置已基本满足了我们对于日志系统的基础需求,在这里,我们可以考虑通过配置Log4j2的配置文件,来实现动态配置将日志文件记录到指定的文件或消息中间件。

Log4j2将日志消息发送到Kafka需要用到Kfaka的客户端jar包,所以,这里首先引入kafka-clients包:

修改log4j2.xml配置将操作日志记录到Kafka,这里需要注意,Log4j2官网说明了这里必须加配置,否则会出现递归调用。

综上,修改后完整的log4j.xml如下,可根据配置自己选择不将操作日志记录到文件:

以上配置完成之后,我们对日志记录进行测试,查看日志是否记录到异步文件和kafka中,在Kfaka服务器启动消费者服务,可以实时观察日志是否推送到Kafka:「SpringCloud」Spring Cloud 微服务日志系统设计与实-鸿蒙开发者社区

「SpringCloud」Spring Cloud 微服务日志系统设计与实-鸿蒙开发者社区

4、由Gateway记录可配置的请求日志

在业务开发过程中,除了操作日志的需求,我们通常还会遇到接口日志的需求,系统需要对接口的请求做统计分析。网关负责把请求转发到各个微服务,在此处比较适合进行API日志收集。

我们必然面临着哪些服务需要收集API日志,需要收集哪些类型的API日志的问题,那么在设计的时候,我们需要考虑使API日志收集可灵活配置。基于简单配置的考虑,我们将这些配置放到Nacos配置中心,如果有更多详细定制化的需求可以设计实现系统配置界面,将配置放到Redis缓存。

因为请求中的RequestBody和ResponseBody都是只能读取一次的,所以这里需要在过滤器中对数据进行一下处理,尽管Gateway提供了缓存RequestBody的过滤器

AdaptCachedBodyGlobalFilter,但是我们这里除了一些对请求的定制化需求外,有可能会用到ResponseBody,所以这里最好还是自定义过滤器。

有一款开源插件

spring-cloud-gateway-plugin非常全面的实现Gateway收集请求日志的过滤器,这里我们直接引用其实现,因为此款插件除了日志记录还有其他不需要的功能,且插件依赖SpringCloud版本,所以,这里只取其日志记录的功能,并根据我们的需求进行部分调整。

1、在我们的配置文件中增加如下配置项:

  • 日志插件开关
  • 记录请求参数开关
  • 记录返回参数开关
  • 需要记录API日志的微服务ID列表
  • 需要记录API日志的URL列表

2、GatewayPluginConfig配置类,可以根据配置项,选择启用初始化哪些过滤器,根据

3、GatewayRequestContextFilter处理请求参数的过滤器,根据spring-cloud-gateway-plugin GatewayContextFilter.java修改。

4、GatewayResponseContextFilter处理返回参数的过滤器,根据spring-cloud-gateway-plugin ResponseLogFilter.java修改。

5、RemoveGatewayContextFilter清空请求参数的过滤器,根据spring-cloud-gateway-plugin RemoveGatewayContextFilter.java修改。

6、RequestLogFilter进行日志记录的过滤器,根据

spring-cloud-gateway-plugin RequestLogFilter.java修改。

7、启动服务,对数据进行测试,我们可以在控制台启动Kfaka消费者,并查看是否有api_log主题的消息:

「SpringCloud」Spring Cloud 微服务日志系统设计与实-鸿蒙开发者社区

 

「SpringCloud」Spring Cloud 微服务日志系统设计与实-鸿蒙开发者社区

8、关于日志数据的存储和处理

将日志消息保存到文件或者Kafka之后,就需要考虑如何处理这些数据,在有规模的微服务集群模式下,是尽量不提倡或者说禁止保存到MySQL这类关系数据库的,如果实在有需要的话,可以通过上篇介绍的,使用Spring Cloud Stream消费日志消息,并保存到指定数据库。下一篇讲如何搭建ELK日志分析系统,处理分析提取这些数据量庞大的日志数据。

源码地址:

Gitee: GitEgg: GitEgg 是一款开源免费的企业级微服务应用开发框架,旨在整合目前主流稳定的开源技术框架,集成常用的**项目解决方案,实现可直接使用的微服务快速开发框架。

GitHub:

https://github.com/wmz1930/GitEgg

小讯
上一篇 2025-06-10 20:30
下一篇 2025-05-22 12:44

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/169140.html