I. 概念
在minbox-logging
日志组件内设计了多个概念以及名词定义,我们本篇文章来讲解下每个概念的含义以及作用。
0. 源码 & 文档
- 源码:https://gitee.com/minbox-proj...
- 文档:https://gitee.com/minbox-proj...
- ApiBoot整合示例:ApiBoot Logging Configuration
1. Client
client
在整体架构体系中是客户端
的概念,也就是我们的业务服务角色,在用户发起一个请求时,可能会经过多个业务服务来完成一系列的业务操作或者查询结果的组装,而每个服务在minbox-logging
内就是client
的概念,client
要完成的工作是日志的采集
、上报
、缓存
等。
1.1 日志采集
client
目前版本支持采集spring-mvc
的web
应用程序请求日志信息(目前版本暂未支持web-flux
),通过拦截器
获取每次请求的链路编号(traceId)
、单元编号(spanId)
、请求参数
、请求主体
、Header列表
、请求路径
、请求耗时
等详细信息,根据采集到的日志参数可以精准的定位到请求信息。
1.2 日志上报
client
目前支持两种上报方式,分别是:just(直接上报)
、timing(定时延迟上报)
,当采集到日志信息后通过拦截LoggingWebInterceptor#afterCompletion
方法来进行异步上报信息,在这里采用异步上传的方式,为了防止出现日志上报网络延迟导致用户发起的请求
响应时间过长。
1.3 日志缓存
client
端提供了短暂的内存方式缓存
,当我们使用timing
方式进行上报日志时,日志临时会存储到memory(内存)
中,每次定时上报会从内存缓存
中取到配置数量的请求日志一并上报到admin
,一次上报的数量也有使用者自定义配置,默认为10
。
当client
正常停止时,通过实现DisposableBean
接口的destory
方法内会一并将内存缓存
的请求日志一并上报到admin
。
2. Admin
admin
在整体架构体系中担任管理端
的角色,用于接收client
上报的请求日志、存储日志
、日志分析
等操作。
在minbox-logging
体系中admin
并不是必须存在的,如果是单体应用程序,可单独使用client
在本地进行采集、存储、分析等。
2.1 日志接收
admin
内部提供了一个上报日志的端点,该端点是一个标准的REST
接口定义,可一次性接收一个client
上传的多条请求日志。
执行顺序:
- 检查
client
是否为第一次上报日志,如果是则执行保存服务器基本信息 - 执行保存该
client
对应服务器的请求日志信息到数据库
2.2 日志存储
admin
内部提供了数据库
方式的存储实现类LoggingDataSourceStorage
,通过创建LoggingDataSourceStorage
的对象并且设置到LoggingAdminFactoryBean
内即可完成配置,在创建LoggingDataSourceStorage
对象时需要传递数据源,内部是通过JDBC
直接操作SQL
来完成的数据操作,这样不依赖任何第三方ORM
框架, 只需要DataSource
对象即可。
2.3 自定义存储
目前版本admin
仅提供了一个数据源方式存储,如果我们需要自定义存储可以通过实现LoggingStorage
接口,然后创建自定义的对象实例后设置到LoggingAdminFactoryBean
内即可。
2.4 日志分析(规划中)
在admin
端,我们拿到数据后可以针对某一些点进行分析,比如:请求耗时较多的接口、接口的调用频率,针对调用频率可以有效的扩展对应服务的节点数量来应对流量。
3. Cache
cache
用于临时缓存请求日志
,尽在timing
上报方式下生效。
4. ReportScheduled
定时上报日志,应用于timing
上报方式,内部是一个定时线程,间隔一段时间调用上报日志
方法。
每次默认会上报10条请求日志,每间隔5秒执行一次。
5. AdminDiscovery
AdminDiscovery
来client
用于发现admin
服务的接口定义,在client
内提供了两种方式,分别是:LoggingAppointAdminDiscovery
、LoggingRegistryCenterAdminDiscovery
。
通过LoggingFactoryBean#setLoggingAdminDiscovery
方法进行设置。
5.1 LoggingAppointAdminDiscovery
指定admin
具体地址信息的发现方式,通过构造函数可以指定多个admin
地址,而且每个admin
地址可以使用不同的basic
基础认证信息。
当指定多个admin
时,默认通过平滑轮询策略负载均衡方式上报,可自定义指定随机策略
负载均衡方式。
admin
地址的格式为:user:123456@localhost:9090
,@
前面为basic
认证信息。
5.2 LoggingRegistryCenterAdminDiscovery
admin
支持从服务注册中心(Eureka、Consul、Nacos Discovery、Zookeeper等)内读取指定applicationId
的服务节点列表,通过ribbon
默认的负载均衡策略进行获取可用admin
节点信息。
如果是
SpringCloud
构建的项目,建议使用这种方式。
6. LoggingNotice
client
的日志通知方法,默认该接口有两个实现类,分别是:LoggingLocalNotice
、LoggingAdminNotice
,当一个请求完成时,client
会发布一个LoggingNoticeEvent
事件,该事件的监听者会获取LoggingNotice
的全部实现类,根据getOrder
方法的值顺序执行,值越大越靠前。
6.1 LoggingLocalNotice
client
的本地控制台输出日志、控制台格式化日志的LoggingNotice
实现类,会第一个被执行。
6.2 LoggingAdminNotice
client
的上报日志到admin
入口,会根据上报方式进行执行对应的业务逻辑。
- timing(延迟上报)
会将本次的
MinBoxLog
对象缓存到cache
,放入内存。 - just(直接上报)
通过
LoggingFactoryBean
获取LoggingAdminReport
实现类,调用report
方法进行上报日志信息到admin
。
7. ReportLogEvent
当client
将日志上报到admin
后,admin
会通过ApplicationContext
发布ReportLogEvent
事件,在admin
内提供了两个该事件的监听实现,分别是:ReportLogJsonFormatListener
、ReportLogStorageListener
。
7.1 ReportLogJsonFormatListener
用于格式化并在控制台显示client
上报的日志信息。
7.2 ReportLogStorageListener
获取LoggingAdminFactoryBean
提供的LoggingStorage
接口实现类实例来进行持久化请求日志。
7.3 自定义监听
通过实现Spring
提供的SmartApplicationListener
监听器接口来自定义日志的存储或者其他分析操作,具体实现详见文档。