您現在的位置是:首頁 > 攝影首頁攝影

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

由 JAVA柯尼塞克丶 發表于 攝影2021-09-07
簡介14. 自定義日誌上報通知Logging Client 提供日誌上報通知功能,只需要實現 LoggingNotice 介面即可獲取每次上報的 請求日誌詳細物件 ,進行日誌的自定義處理,如下所示:** * 自定義日誌通知 * @author

格式化操作在事件日誌裡怎樣查詢

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@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. 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@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地址負載均衡配置

如果我們在建立 LoggingAppointAdminDiscovery 物件時傳遞了多個 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預設採用SmoothWeightedRoundRobinStrategy(平滑輪詢權重)負載均衡策略。

6.1.2. 隨機權重負載策略

雖然 LoggingAppointAdminDiscovery 在建構函式內預設例項化了 平滑輪詢負載策略 ,我們當然可以透過 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 內部提供了整合 服務註冊中心 的服務發現實現 LoggingRegistryCenterAdminDiscovery ,透過配置例項化該類並放入 Spring IOC 即可完成自動從 服務註冊中心 內獲取 Logging Admin 資訊。

ApiBoot 配置使用

LoggingRegistryCenterAdminDiscovery

實踐示例,詳見原始碼,

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(“-”, “”); }}

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

// 建立自定義策略物件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@ConditionalOnMissingBeanpublic LoggingAppointAdminDiscovery loggingConfigAdminDiscovery() { // 初始化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;}

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

日誌通知實現類功能作用LoggingLocalNotice

LoggingLocalNotice 日誌通知用於在 控制檯顯示、格式化 日誌物件詳細資訊,優先順序為 Integer。MIN_VALUE ,原始碼詳見 org。minbox。framework。logging。client。notice。support。LoggingLocalNotice 。

LoggingAdminNotice

LoggingAdminNotice 日誌通知用於 上報日誌 資訊到 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@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 ‘上報服務的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 新增依賴如下所示:

<!——ApiBoot提供的持久化框架——> org。minbox。framework api-boot-starter-mybatis-enhance {ApiBoot最新版本}<!——MySQL資料庫驅動——> mysql mysql-connector-java 8。0。17<!——Hikari資料來源——> 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 恆宇少年 */@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 可以訪問

SpringBoot使用ApplicationEvent&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);