零侵入式分佈式鏈路日誌minbox-logging使用文檔v1.0

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使用文檔v1.0

在一次請求中,經過的每一個 服務(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 。

@EnableLoggingClient使用示例如下所示:

@SpringBootApplication
@EnableLoggingClient
public 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. RestTemplate透傳鏈路信息

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 接口實現類 LoggingOpenFeignInterceptor來完成鏈路信息透傳, 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 其中一個實現類 LoggingAppointAdminDiscovery 來進行獲取。

下面是 ApiBoot 配置使用 LoggingAppointAdminDiscovery 實踐示例,

詳見源碼, ApiBootLoggingAdminAppointAutoConfiguration

/**
* ApiBoot Logging Admin Config Discovery
* Multiple Use "," Separation
*
* @return LoggingAdminDiscovery
*/
@Bean
@ConditionalOnMissingBean
public 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地址負載均衡配置

如果我們在創建 LoggingAppointAdminDiscovery 對象時傳遞了多個 Logging Admin 地址,比如:

@Bean
@ConditionalOnMissingBean
public 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默認採用SmoothWeightedRoundRobinStrategy(平滑輪詢權重)負載均衡策略。

6.1.2. 隨機權重負載策略

雖然 LoggingAppointAdminDiscovery 在構造函數內默認實例化了 平滑輪詢負載策略 ,我們當然可以通過 LoggingAppointAdminDiscovery#setLoadBalanceStrategy 方法來進行設置具體的策略, 隨機權重策略 設置方式如下所示:

@Bean
@ConditionalOnMissingBean
public 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:8080
127.0.0.1:8080
127.0.0.1:9090
127.0.0.1:8080
127.0.0.1:9090
127.0.0.1:9090
127.0.0.1:9090

6.1.3. 平滑輪詢權重負載策略

SmoothWeightedRoundRobinStrategy(平滑輪詢權重負載策略)是平滑分配指定的 Logging Admin 地址,在上面示例中,平滑輪詢權重的結果為:

平滑輪詢權重獲取到的 Logging Admin 地址:
127.0.0.1:8080
127.0.0.1:9090
127.0.0.1:8080
127.0.0.1:9090
127.0.0.1:8080
127.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 內部提供了集成 服務註冊中心 的服務發現實現 LoggingRegistryCenterAdminDiscovery ,通過配置實例化該類並放入 Spring IOC 即可完成自動從 服務註冊中心 內獲取 Logging Admin 信息。

ApiBoot 配置使用 LoggingRegistryCenterAdminDiscovery 實踐示例,詳見源碼, ApiBootLoggingAdminDiscoveryAutoConfiguration

/**
* ApiBoot Logging Admin Registry Center Discovery
* @param loadBalancerClient LoadBalance Client
* @return LoggingRegistryCenterAdminDiscovery
*/
@Bean
@ConditionalOnMissingBean
public 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 枚舉,修改如下所示:

// 設置上報方式為:timing
factoryBean.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("-", "");
 }
}

設置使用自定義的策略如下所示:

// 創建自定義策略對象
CustomerTraceIdGenerator 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
@ConditionalOnMissingBean
public LoggingAppointAdminDiscovery loggingConfigAdminDiscovery() {
 // 初始化Logging Admin地址列表
 String[] adminAddressArray = {"user:[email protected]:8080,user:[email protected]: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
@ConditionalOnMissingBean
public 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;
}

上面示例所示,根據 LoggingRegistryCenterAdminDiscovery#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 恆宇少年
 */
@Component
public 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 。

日誌通知實現類功能作用LoggingLocalNoticeLoggingLocalNotice 日誌通知用於在 控制檯顯示、格式化 日誌對象詳細信息,優先級為 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 。

@EnableLoggingAdmin使用示例如下所示:

@SpringBootApplication
@EnableLoggingAdmin
public 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 '上報服務的ID,對應spring.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 新增依賴如下所示:

 

 org.minbox.framework
 api-boot-starter-mybatis-enhance
 {ApiBoot最新版本}

 

 mysql
 mysql-connector-java
 8.0.17

 

 com.zaxxer
 HikariCP
 3.2.0

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. 添加支持Spring Security

在項目的 pom.xml 內添加如下依賴:

 org.springframework.boot
 spring-boot-starter-security

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 恆宇少年
 */
@Component
public 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 可以訪問 SpringBoot使用ApplicationEvent&Listener完成業務解耦

20. LoggingAdminFactoryBean

LoggingAdminFactoryBean 是配置 Logging Admin 的必要途徑,通過該類可以對 Logging Admin 進行全方面的配置。

ApiBoot 集成 Logging Admin FactoryBean 示例如下所示:

/**
* instantiation {@link LoggingAdminFactoryBean}
*
* @param dataSource {@link DataSource}
* @return LoggingAdminFactoryBean
*/
@Bean
public 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);


分享到:


相關文章: