当前位置: 首页 > 图灵资讯 > 技术篇> 零侵入式分布式链路日志minbox-logging

零侵入式分布式链路日志minbox-logging

来源:图灵教育
时间:2023-06-30 16:25:59

MinBox Logging

MinBox Logging 支持分布式、零侵入式链路日志分析框架 SpringCloud 在微服务架构下配置使用,内部封装 RestTemplate 、 OpenFeign 通过链路信息的两种方式。

零侵入式

MinBox Logging 采集链路日志不需要使用注释配置,只需添加 依赖 后简单配置 Minbox Loggin Admin 的相关 地址 或 服务名称 每次收到请求时,都会自动报告请求对应链路日志的详细信息 MinBox Logging Admin 后续分析、报警通知等。

源码地址

https://gitee.com/minbox-projects/minbox-logging

I. 概念

1. 链路架构图

零侵入式分布式链路日志minbox-logging_自定义

编辑

添加图片注释不得超过 140 字(可选)

在一个请求中,经过的每一个 服务(MicroService) 的 链路编号(TraceId) 保持一致,通过 SpanID 、 ParentSpanID 链接上下级关系。

2. 提交使用中遇到的问题

如果您在集成使用过程中遇到问题,请提交 issues ,提交地址: 创建Issues

3. Apiboot集成实践示例

ApiBoot 作为 MinBox 开源组织组件的最佳集成方案将在第一时间进行集成 minbox-projects 新发布的组件在开源组织中, MinBox Logging 请访问整合实践 ApiBoot 源码 ,详见org,集成源码.minbox.framework.api.boot.autoconfigure.logging 。

II. 配置客户端

4. 启用客户端

minbox-logging-spring-context 依赖内提供 @EnableLoggingClient 注释用于启用客户端,注释用于配置 @Import 自动注册 Logging Client 运行所需 Bean 。

@EnablelogingClient使用示例如下:

@SpringBootApplication@EnableLoggingClientpublic class ApiBootLoggingApplication { /** * logger instance */ static Logger logger = LoggerFactory.getLogger(ApiBootLoggingApplication.class); public static void main(String[] args) { SpringApplication.run(ApiBootLoggingApplication.class, args); logger.info(”{}成功启动服务.", "ApiBoot Logging Client"); }}

5. 传输链路信息

每次发送请求时,都会产生链路信息,链路单元(Span)目前,以前的相互访问是基于 http 、 rpc 以其他方式为主要比例。

链路信息(Trace)的传递, Logging Client 内部提供提取请求 header 链路信息编号内部(TraceID)、上级单位编号(Parent SpanID),通过这种方式,整个链路绑定了上下级单元关系和链路关系。

5.1. Restemplate透传链路信息

RestTemplate 是 Spring Web 组件提供的请求包装对象可用于将请求以指定的方式发送到目标地址,并可携带 header 传递身份认证信息、请求、响应等信息。

Logging Client 则是利用 RestTemplate 拦截器将链路(Trace)信息写入请求 header传递给下一个单元(Span)。

Logging Client 已经提供了 RestTemplate 在LoggingRestTemplateInterceptor中,拦截器实现类, LoggingFactoryBean#afterPropertiesSet 该方法实例化,并设置了拦截器,在 Logging Client 报告请求日志信息时,全部通过 LoggingFactoryBean#restTemplate 执行发送请求 Admin ,所以只需要实例化 LoggingFactoryBean 即可。

5.2. Openfeign透传链路信息

OpenFeign 是 SpringCloud 根据接口配置信息发送请求并获取响应内容,实现服务之间相互调用的方法。

Logging Client 同样是利用 OpenFeign 提供的拦截器将链路(Trace)信息写入服务相互调用的请求 header ,传递到下一个服务。

Logging Client 内部提供了 RequestInterceptor 接口实现类Logingopenfeinterceptor完成链路信息传输, OpenFeign 会自动检索 Spring IOC 容器内 RequestInterceptor 接口的实现类实例,每次通过 OpenFeign 启动请求时会进行调用 RequestInterceptor 实现类的 apply 完成拦截业务处理的方法。

6. 发现Admin并报告日志

Logging Client 默认情况下,本地不进行持久存储 请求日志 信息,而是本地生成的信息 请求日志 报告详细信息 Logging Admin ,由 Admin 存储、分析等。

Logging Client 内部提供 LoggingAdminDiscovery#lookup 进行接口方法 发现Admin地址 。

6.1. Admin发现了指定的地址

Logging Client 获取指定 Admin 地址是通过 LoggingAdminDiscovery 实现Logingappointadmindiscovery 获取。

下面是 ApiBoot Logingappointadmindiscovery配置 实践示例,

详见源码,ApiBootLoggingAdminAppointAutoConfiguration

/*** ApiBoot Logging Admin Config Discovery* Multiple Use "," Separation** @return LoggingAdminDiscovery*/@Bean@ConditionalOnMissingBeanpublic LoggingAppointAdminDiscovery loggingConfigAdminDiscovery() { String[] adminAddressArray = apiBootLoggingProperties.getAdmin().getServerAddress().split(","); LoggingAppointAdminDiscovery appointAdminDiscovery = new LoggingAppointAdminDiscovery(adminAddressArray); return appointAdminDiscovery;}

LoggingAppointAdminDiscovery 需要提供构造函数 Logging Admin 地址数组,格式为: ip(IP地址):port(端口号) ,不需要添加任何内容 http 、 https 前缀。

6.1.1. 多Admin地址负载均衡配置

创建LoggingAppointAdminDiscove 多个物体被传递 Logging Admin 例如:地址:

@Bean@ConditionalOnMissingBeanpublic LoggingAppointAdminDiscovery loggingConfigAdminDiscovery() { // Logging初始化 Admin地址列表 String[] adminAddressArray = {"127.0.0.1:8080,127.0.0.1:9090"}; LoggingAppointAdminDiscovery appointAdminDiscovery = new LoggingAppointAdminDiscovery(adminAddressArray); return appointAdminDiscovery;}

如上图所示,我启动了两个 Logging Admin 来进行接收 Logging Client 存储收集到的请求日志信息, Logging Client 具体用什么? LoadBlanace 选择上报的策略(负载均衡) Logging Admin 节点?

Logging Client 提供了 LoadBalanceStrategy 负载均衡战略界面,内部实现了两种战略,即: RandomWeightedStrategy 、SmoothWeightedRoundRobinStrategy 。

Logging Client默认采用SmothweightedroundrobinStrategy(平滑轮询权重)负载平衡策略。

6.1.2. 随机权重负载策略

虽然Logingappointadmindiscory 在构造函数中默认实例化 平滑轮询负载策略 ,当然,我们可以通过 LoggingAppointAdminDiscovery#setLoadBalanceStrategy 设置具体策略的方法, 随机权重策略 设置方法如下:

@Bean@ConditionalOnMissingBeanpublic LoggingAppointAdminDiscovery loggingConfigAdminDiscovery() { // Logging初始化 地址列表Admin String[] adminAddressArray = {"127.0.0.1:8080,127.0.0.1:9090"}; LoggingAppointAdminDiscovery appointAdminDiscovery = new LoggingAppointAdminDiscovery(adminAddressArray); // 实例化随机权重策略 RandomWeightedStrategy randomWeightedStrategy = new RandomWeightedStrategy(); // 设置负载均衡策略 appointAdminDiscovery.setLoadBalanceStrategy(randomWeightedStrategy); return appointAdminDiscovery;}

RandomWeightedStrategy(随机权重负载策略)是指定的随机分配选择 Logging Admin 在上述示例中,随机权重的结果可能是:

获得随机权重 Logging Admin 地址:127.0.0.1:8080127.0.0.1:8080127.0.0.1:9090127.0.0.1:8080127.0.0.1:9090127.0.0.1:9090127.0.0.1:9090

6.1.3. 平滑轮询权重负荷策略

SmoothWeightedRoundRobinStrategy(平滑轮查询权重负载策略)指定平滑分配 Logging Admin 在上述示例中,平滑轮查询权重的结果如下:

获得平滑轮询权重获得的平滑轮询权重 Logging Admin 地址:127.0.0.1:8080127.0.0.1:9090127.0.0.1:8080127.0.0.1:9090127.0.0.1:8080127.0.0.1:9090

6.2. Admin发现服务注册中心

在 SpringCloud MicroService 使用部署模式时,可以使用 Logging Admin 注册为单独的服务 Service Registry Center (服务注册中心,如: Eureka 、 Zookeeper 、 Consul 、 Nacos Discovery 等等),这样在 Logging Client 可通过服务注册的发现接口完成 Logging Admin 获取地址后进行发现 报告请求日志 。

Logging Client 内部提供集成 服务注册中心 Logingregistrycenteradmindiscovery的服务发现 ,通过配置实例化类别,并将其放入 Spring IOC 即可完成自动从 服务注册中心 内获取 Logging Admin 信息。

ApiBoot Logingregistrycenteradmindindiscovery 实践示例,详见源码,ApiBootLoggingAdminDiscoveryAutoConfiguration

/*** ApiBoot Logging Admin Registry Center Discovery* @param loadBalancerClient LoadBalance Client* @return LoggingRegistryCenterAdminDiscovery*/@Bean@ConditionalOnMissingBeanpublic LoggingRegistryCenterAdminDiscovery loggingRegistryCenterAdminDiscovery(LoadBalancerClient loadBalancerClient) { LoggingRegistryCenterAdminDiscovery registryCenterAdminDiscovery = new LoggingRegistryCenterAdminDiscovery(apiBootLoggingProperties.getDiscovery().getServiceId(), loadBalancerClient); return registryCenterAdminDiscovery;}

LoadBalancerclient SpringCloud 通过客户端对象的负载平衡,客户端对象的负载平衡 SpringCloud 依赖的自动配置和放置 Spring IOC ,注入对象后,可以平衡负载,找到可用的指定 serviceID 的服务对象 ServiceInstance 。

7. 延迟上报日志

Logging Client 默认采用了 just (直接报告)报告收集到的方式 请求日志 ,每次生成请求日志,都会实时报告 Logging Admin ,有时需求往往会发生很大的变化,比如减少 Logging Admin 压力,每次都有可能报告 20条 请求日志 到 Logging Admin 。

针对这种业务情况, Logging Client 提供定期报告的方式。

7.1. 配置报告方式

上报方式 通过 LoggingFactoryBean#setReportAway 修改默认值的方法是org.minbox.framework.logging.core.ReportAway 修改如下:枚举:

// 设置报告方式如下:timingfactoryBean.setReportAway(ReportAway.timing);

7.2. 设置单次报告的日志数量

默认值为单个报告请求日志的数量: 10 。

通过 LoggingFactoryBean#setNumberOfRequestLog 修改默认值的方法如下:

// 设置每次报告的请求日志数量factoryBean.setNumberOfRequestLog(20);

7.3. 设置上报日志间隔时间设置

上报日志默认间隔时间为: 5秒 。

通过 LoggingFactoryBean#setReportIntervalSecond 修改默认值的方法如下:

// 设备报告间隔时间,单位:秒factoryBean.setReportIntervalSecond(5);

8. 自定义TraceID生成规则

Logging Client 默认使用 UUID 作为生成的字符串 TraceId (链路编号),通过 LoggingFactoryBean#setTraceGenerator 修改默认生成规则的方法需要自定义策略 LoggingTraceGenerator 接口如下:

/** * 定制链路编号(TraceID){@link LoggingTraceGenerator} * * @author 恒宇少年 */public class CustomerTraceIdGenerator implements LoggingTraceGenerator { @Override public String createTraceId() throws MinBoxLoggingException { return UUID.randomUUID().toString().replace("-", ""); }}

自定义策略的设置如下:

// Customertracedgenerator创建自定义策略对象 customerTraceIdGenerator = new CustomerTraceIdGenerator();// 使用自定义生成TraceID的战略factoryBean设置.setTraceGenerator(customerTraceIdGenerator);

9. 自定义SpanID生成规则

Logging Client 默认使用 UUID 作为生成的字符串 SpanId (单元编号),通过 LoggingFactoryBean#setSpanGenerator 修改默认生成规则的方法需要自定义策略 LoggingSpanGenerator 接口,如下所示:

/** * 定制单元编号(SpanID){@link LoggingSpanGenerator} * * @author 恒宇少年 */public class CustomerSpanIdGenerator implements LoggingSpanGenerator { @Override public String createSpanId() throws MinBoxLoggingException { String currentTime = String.valueOf(System.currentTimeMillis()); return String.format("%s-%s", "span", currentTime); }}

自定义策略的设置如下:

// CustomerSpanidgenerator创建自定义策略对象 customerSpanIdGenerator = new CustomerSpanIdGenerator();// 使用自定义生成SpanID的策略factoryBean.setSpanGenerator(customerSpanIdGenerator);

10. 排除部分路径不上报日志

Logging Client 内部默认排除 /error 路径不报告日志。如果业务服务中有一些频繁访问的接口,且接口不涉及业务请求,建议排除这些请求,如集成 SpringBootAdmin 之后会经常访问 /actuator/health 检查服务的健康状况。

通过 LoggingFactoryBean#setIgnorePaths 方法进行 追加 排除路径 ,这里要注意的是追加而不是替换,所以 /error 总是在排除列表中,配置排除路径如下:

// String[]需要排除的路径列表 ignorePaths = new String[]{ "/actuator/health", "/index", "/test"};// FactoryBean设置排除的路径列表.setIgnorePaths(ignorePaths);

11. 安全报告日志

分布式日志采集和日志存储肯定会有安全问题,所以在 Logging Admin 这个问题已经在服务端解决了, Logging Admin 通过集成 Spring Security 配置用户名和密码 Basic Auth认证。

在 Logging Client 发起上报请求时,会提取 Logging Admin 路径内的 Basic Auth 通过认证信息 header 传递认证信息的形式。

11.1. 指定Admin地址的配置

如果采用LoggingAppointAdminDiscovery 方式配置 Logging Admin 如果发现服务地址,构造函数将初始化 Logging Admin 需要携带地址 Basic Auth 用户名和密码信息如下所示:

@Bean@ConditionalOnMissingBeanpublic LoggingAppointAdminDiscovery loggingConfigAdminDiscovery() { // Logging初始Logging 地址列表Admin String[] adminAddressArray = {"user:123@127.0.0.1:8080,user:123@127.0.0.1:9090"}; LoggingAppointAdminDiscovery appointAdminDiscovery = new LoggingAppointAdminDiscovery(adminAddressArray); return appointAdminDiscovery;}

在上面的示例中可以看到 Basic Auth 是通过 username:password@IP:Port 配置格式,包括 user 而且是用户名 123 这就是用户的密码。

11.2. 配置服务注册中心

使用LoggingRegistryCenterAdminDiscovery 方式配置 Logging Admin 配置如下:

/*** ApiBoot Logging Admin Registry Center Discovery* setting basic auth username if not empty {@link LoggingRegistryCenterAdminDiscovery#setUsername(String)}* setting basic auth password if not empty {@link LoggingRegistryCenterAdminDiscovery#setPassword(String)}** @param loadBalancerClient LoadBalance Client* @return LoggingRegistryCenterAdminDiscovery*/@Bean@ConditionalOnMissingBeanpublic LoggingRegistryCenterAdminDiscovery loggingRegistryCenterAdminDiscovery(LoadBalancerClient loadBalancerClient) { LoggingRegistryCenterAdminDiscovery registryCenterAdminDiscovery = new LoggingRegistryCenterAdminDiscovery(apiBootLoggingProperties.getDiscovery().getServiceId(), loadBalancerClient); // 用户名 String basicAuthUserName = apiBootLoggingProperties.getDiscovery().getUsername(); if (ObjectUtils.isEmpty(basicAuthUserName)) { registryCenterAdminDiscovery.setUsername(basicAuthUserName); } // 密码 String basicAuthPassword = apiBootLoggingProperties.getDiscovery().getPassword(); if (!ObjectUtils.isEmpty(basicAuthPassword)) { registryCenterAdminDiscovery.setPassword(basicAuthPassword); } return registryCenterAdminDiscovery;}

上面的例子显示,根据Logingregistrycenteradmindiscovery,#setUsername 根据方法设置用户名,根据 LoggingRegistryCenterAdminDiscovery#setPassword 设置密码的方法。

12. 控制台显示报告日志

Logging Client 默认情况下不会在控制台 打印 即将上报的 请求日志 可以通过信息 LoggingFactiory#setShowConsoleLog 设置方法如下所示:

// 日志factoryBean设置在控制台输出上报.setShowConsoleLog(true);

13. 格式化控制台显示报告日志

Logging Client 默认情况下,在控制台打印报告的请求日志时,不会格式化 json 根据字符串 LoggingFactoryBean#setFormatConsoleLog 设置方法,如下所示:

// 日志factoryBean设置格式化输出报告.setFormatConsoleLog(true);

14. 报告自定义日志的通知

Logging Client 提供日志报告通知功能,只需实现 LoggingNotice 接口可以获得每次报告的接口 详细的请求日志对象 ,对日志进行定制处理,如下所示:

/** * 自定义日志通知 * @author 恒宇少年 */@Componentpublic class CustomerLoggingNotice implements LoggingNotice { /** * 通知方法 * 处理自定义的业务逻辑 * @param minBoxLog */ @Override public void notice(MinBoxLog minBoxLog) { System.out.println(minBoxLog.getTraceId()); // 定制业务处理... } /** * 优先级执行通知 * {@link #getOrder()方法返回值越小,优先级越高 * * @return */ @Override public int getOrder() { return 1; }}

14.1. 内置日志通知

Logging Client 日志通知的具体实现内部提供: LoggingLocalNotice , LoggingAdminNotice 。

LoginglocalNoticeloginglocalNoticelogloglocalnotice 用于日志通知 控制台显示,格式化 详细的日志对象信息,优先级为 Integer.MIN_VALUE ,详见org,源码.minbox.framework.logging.client.notice.support.LoggingLocalNotice 。LoggingAdminNoticeLoggingAdminNotice 用于日志通知 上报日志 信息到 Logging Admin ,优先级为 Integer.MIN_VALUE + 1 ,源码详见:org.minbox.framework.logging.client.notice.support.LoggingAdminNotice 。

14.2. 定制多个日志并报告通知

Logging Client 内部通过 ApplicationContext 从 Spring IOC 内获取指定 LoggingNotice 正因为如此,类型的实例列表得到了支持 多日志通知 的方式。

注:建议不要重复日志通知实现类的优先级。

III. 配置服务端

15. 启用服务端

在minbox-logging-spring-context 依赖内提供 @EnableLoggingAdmin 注释用于启用服务端,注释用于配置 @Import 自动注册 Logging Admin 运行所需 Bean 。

@EnablelogingAdmin使用示例如下:

@SpringBootApplication@EnableLoggingAdminpublic class ApiBootLoggingAdminApplication { /** * logger instance */ static Logger logger = LoggerFactory.getLogger(ApiBootLoggingAdminApplication.class); public static void main(String[] args) { SpringApplication.run(ApiBootLoggingAdminApplication.class, args); logger.info(”{}成功启动服务.", "Logging Admin"); }}

16. 初始化数据库

Logging Admin 支持将 Logging Client 上报的请求日志保存在数据库中,并提供固定的表结构,如下所示:

SET NAMES utf8mb4 ;---- Table structure for table `logging_service_details`--DROP TABLE IF EXISTS `logging_service_details`;SET character_set_client = utf8mb4 ;CREATE TABLE `logging_service_details` ( `lsd_id` varchar(36) COLLATE utf8mb4_general_ci NOT NULL, `lsd_service_id` varchar(200) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT 与spring相对应的上报服务ID.application.name配置值, `lsd_service_ip` varchar(50) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT IP地址上报服务, `lsd_service_port` int(11) DEFAULT NULL COMMENT 端口号上报服务, `lsd_last_report_time` timestamp NULL DEFAULT NULL COMMENT "最后一次报告时间,每次报告更新', `lsd_create_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT 在第一次报告时创建时间, PRIMARY KEY (`lsd_id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT=上报日志的客户端服务细节;---- Table structure for table `logging_request_logs`--DROP TABLE IF EXISTS `logging_request_logs`;SET character_set_client = utf8mb4 ;CREATE TABLE `logging_request_logs` ( `lrl_id` varchar(36) COLLATE utf8mb4_general_ci NOT NULL COMMENT '主键,UUID', `lrl_service_detail_id` varchar(36) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT 与logging相关的服务详情编号_service_details主键, `lrl_trace_id` varchar(36) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT "链路ID", `lrl_parent_span_id` varchar(36) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT 上级跨度ID, `lrl_span_id` varchar(36) COLLATE utf8mb4__general_ci DEFAULT NULL COMMENT “跨度ID”, `lrl_start_time` mediumtext COLLATE utf8mb4_general_ci COMMENT 要求开始时间, `lrl_end_time` mediumtext COLLATE utf8mb4_general_ci COMMENT 要求结束时间, `lrl_http_status` int(11) DEFAULT NULL COMMENT 要求响应状态码, `lrl_request_body` longtext COLLATE utf8mb4_general_ci COMMENT 要求主要内容, `lrl_request_headers` text COLLATE utf8mb4_general_ci COMMENT "请求头信息", `lrl_request_ip` varchar(30) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT 要求客户端发起IP地址, `lrl_request_method` varchar(10) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT "请求方式", `lrl_request_uri` varchar(200) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT 要求路径, `lrl_response_body` longtext COLLATE utf8mb4_general_ci COMMENT “响应内容”, `lrl_response_headers` text COLLATE utf8mb4_general_ci COMMENT "响应头信息", `lrl_time_consuming` int(11) DEFAULT NULL COMMENT 要求耗时, `lrl_create_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT “日志保存时间”, `lrl_request_params` text COLLATE utf8mb4_general_ci, `lrl_exception_stack` text COLLATE utf8mb4_general_ci, PRIMARY KEY (`lrl_id`), KEY `logging_request_logs_LRL_SERVICE_DETAIL_ID_index` (`lrl_service_detail_id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT=要求日志信息表;

16.1. 将日志持久化为数据库

初始化 Logging Admin 在所需的表结构之后,我们进行了整合 Logging Admin 添加到项目中 数据源 、 数据库驱动 、 持久化框架 等待依赖,然后配置与数据源相关的数据库参数,以下是 SpringBoot 项目示例。

16.1.1 增加所需的依赖性

pom.xml 新增依赖如下:

<!--ApiBoot提供了一个持久的框架--><dependency> <groupId>org.minbox.framework</groupId> <artifactId>api-boot-starter-mybatis-enhance</artifactId> <version>{apiboot最新版本}</version></dependency><!--MySQL数据库驱动驱动--><dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.17</version></dependency><!--Hikari数据源--><dependency> <groupId>com.zaxxer</groupId> <artifactId>HikariCP</artifactId> <version>3.2.0</version></dependency>

Logging Admin 不固定依赖 ApiBoot 任何框架都可以依赖于提供的持久框架, Logging Admin 只需要内部 DataSource 例子也可以自定义创建 DataSource 对象放入 Spring IOC。

16.1.2. 配置数据源参数

spring: # 数据源参数 datasource: driver-class-name: com.mysql.cj.jdbc.Driver type: com.zaxxer.hikari.HikariDataSource username: root password: 123456 url: jdbc:mysql://localhost:3306/test

17. 将Admin注册为SpringCloud

Logging Admin 添加作为一种依赖 SpringBoot 在项目中,我们只需要考虑如何处理它 SpringBoot项目注册 服务注册中心 (SpringCloud Service Register Center),假如你用的 Eureka 作为一个服务注册中心,请访问我之前写的文章 在Eureka服务中心注册微服务提供商

18. 使用安全配置

Logging Admin 使用的安全性是 Spring Security 提供的 Basic Auth 来完成。

18.1. 添加支持Springng Security

在项目的 pom.xml 添加以下依赖:

<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId></dependency>

18.2. 安全用户配置

建议采用 Spring Security 提供的 内存方式 来配置 Logging Admin , application.yml 配置文件如下:

spring: security: user: # 用户名 name: user # 密码 password: 123

19. 监听日志报告事件

Logging Admin 支持自定义处理监听 Logging Client 报告的日志信息可以自定义存储、格式化处理、分组分类等。自定义事件监控沿用 Spring Event/Listener 如下所示:方法:

/** * 定制报告日志事件{@link ReportLogEvent}监听 * * @author 恒宇少年 */@Componentpublic class CustomerReportEventListener implements SmartApplicationListener { /** * 判断事件类型为{@link ReportLogEvent} * * @param eventType * @return */ @Override public boolean supportsEventType(Class<? extends ApplicationEvent> eventType) { return ReportLogEvent.class == eventType; } /** * 定制处理业务 * * @param event */ @Override public void onApplicationEvent(ApplicationEvent event) { ReportLogEvent reportLogEvent = (ReportLogEvent) event; LoggingClientNotice loggingClientNotice = reportLogEvent.getLogClientNotice(); System.out.println(”上报日志的服务ID:" + loggingClientNotice.getClientServiceId()); // 定制业务处理... }}

19.1. 实现多监控事件

Logging Admin 因为使用的是 Spring 内部提供的 SmartApplicationListener 方式来监听 ReportLogEvent 因此,只需添加多个自定义监控来实现事件 SmartApplicationListener 接口即可。

SmartApplicationListener 由于实现了 Ordered 因此,提供优先配置方法 getOrder ,与 LoggingNotice 接口优先级策略一致, 优先级越小,值越高 。

详细了解 Spring 提供的 Event/Listener 可以访问 ApplicationEventent使用SpringBoot&Listener完成业务解耦

20. LoggingAdminFactoryBean

LoggingAdminFactoryBean 是配置 Logging Admin 通过这种必要的方式,可以对 Logging Admin 全方位配置。

ApiBoot 集成 Logging Admin FactoryBean 示例如下:

/*** instantiation {@link LoggingAdminFactoryBean}** @param dataSource {@link DataSource}* @return LoggingAdminFactoryBean*/@Beanpublic LoggingAdminFactoryBean loggingAdminFactoryBean(DataSource dataSource) { LoggingAdminFactoryBean factoryBean = new LoggingAdminFactoryBean(); factoryBean.setDataSource(dataSource); factoryBean.setShowConsoleReportLog(apiBootLoggingAdminProperties.isShowConsoleReportLog()); factoryBean.setFormatConsoleLogJson(apiBootLoggingAdminProperties.isFormatConsoleLogJson()); logger.info("【LoggingAdminFactoryBean】init successfully."); return factoryBean;}

ApiBoot 集成 LoggingAdminFactoryBean 请访问详细的源码ApiBootLoggingAdminAutoConfiguration

20.1. 设置数据源

通过 LoggingAdminFactoryBean#setDataSource 方法来设置 Logging Admin 需要操作日志数据的数据源如下所示:

// 设置数据源 factoryBean.setDataSource(dataSource);

20.2. 控制台输出报告的日志

通过 LoggingAdminFactoryBean#setShowConsoleReportLog 控制控制台打印的方法 Logging Client 报告的日志信息如下所示:

// 设置在控制台上输出Logging Client 日志factoryBean上报.setShowConsoleReportLog(true);

20.3. 格式控制台输出日志

通过 LoggingAdminFactoryBean#setFormatConsoleLogJson 格式化控制台输出的日志方法如下:

// 格式控制台输出的日志factoryBean.setFormatConsoleLogJson(true);