I. 概念
在minbox-logging日志组件内设计了多个概念以及名词定义,我们本篇文章来讲解下每个概念的含义以及作用。
0. 源码 & 文档
-
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监听器接口来自定义日志的存储或者其他分析操作,具体实现详见文档。