MinBox Logging v1.0.0 使用文檔

  • 2019 年 10 月 11 日
  • 筆記

MinBox Logging

MinBox Logging是一款分佈式、零侵入式的鏈路日誌分析框架,支持SpringCloud微服務架構下配置使用,內部封裝了RestTemplateOpenFeign兩種方式透傳鏈路信息。

零侵入式

MinBox Logging無需使用註解配置採集鏈路日誌,只需要添加依賴後簡單配置Minbox Loggin Admin的相關地址服務名稱即可,每次在收到請求時就會把請求對應的鏈路日誌詳細信息自動上報到MinBox Logging Admin進行後續分析、告警通知等。

源碼地址

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

I. 概念

1. 鏈路架構圖

image

在一次請求中,經過的每一個服務(MicroService)鏈路編號(TraceId)保持一致,通過SpanIDParentSpanID進行鏈路上下級關係銜接。

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)之前的相互訪問目前則以httprpc等方式作為主要佔比。

鏈路信息(Trace)的傳遞,Logging Client內部提供了提取請求header內的鏈路信息編號(TraceID)、上級單元編號(Parent SpanID),整條鏈路都通過這種方式來進行上下級單元關係、鏈路關係綁定。

5.1. RestTemplate透傳鏈路信息

RestTemplateSpring Web組件提供的請求封裝對象,可用於發送指定方式的請求到目標地址,可攜帶header信息進行傳遞身份認證信息、請求、響應等信息。

Logging Client則是利用RestTemplate的攔截器將鏈路(Trace)信息寫入請求的header進行傳遞到下一個單元(Span)。

Logging Client已經提供了RestTemplate攔截器實現類LoggingRestTemplateInterceptor,在LoggingFactoryBean#afterPropertiesSet方法內進行實例化並且已經設置了攔截器,在Logging Client上報請求日誌信息時,都是通過LoggingFactoryBean#restTemplate來執行發送請求到Admin,因此只需要實例化LoggingFactoryBean即可。

5.2. OpenFeign透傳鏈路信息

OpenFeignSpringCloud為服務之間方法相互調用的實現方式,根據接口配置信息來發送請求並獲取響應內容。

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實踐示例,

詳見源碼,<a href="https://gitee.com/minbox-projects/api-boot/blob/master/api-boot-project/api-boot-autoconfigure/src/main/java/org/minbox/framework/api/boot/autoconfigure/logging/ApiBootLoggingAdminAppointAutoConfiguration.java" target="_blank">ApiBootLoggingAdminAppointAutoConfiguration</a>

/**  * 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(端口號),並不需要添加任何httphttps前綴。

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負載均衡策略接口,而內部提供了兩種策略的實現,分別是:RandomWeightedStrategySmoothWeightedRoundRobinStrategy

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(服務註冊中心,如:EurekaZookeeperConsulNacos Discovery等),這樣在Logging Client通過服務註冊的發現接口即可完成Logging Admin的發現,獲取地址後進行上報請求日誌

Logging Client內部提供了集成服務註冊中心的服務發現實現LoggingRegistryCenterAdminDiscovery,通過配置實例化該類並放入Spring IOC即可完成自動從服務註冊中心內獲取Logging Admin信息。

ApiBoot配置使用LoggingRegistryCenterAdminDiscovery實踐示例,詳見源碼,<a href="https://gitee.com/minbox-projects/api-boot/blob/master/api-boot-project/api-boot-autoconfigure/src/main/java/org/minbox/framework/api/boot/autoconfigure/logging/ApiBootLoggingAdminDiscoveryAutoConfiguration.java" target="_blank">ApiBootLoggingAdminDiscoveryAutoConfiguration</a>。

/**  * 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;  }

LoadBalancerClientSpringCloud負載均衡客戶端對象,通過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內部提供了日誌通知的具體實現,分別是:LoggingLocalNoticeLoggingAdminNotice

日誌通知實現類

功能作用

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內部通過ApplicationContextSpring 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新增依賴如下所示:

<!--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作為服務註冊中心,請訪問我之前編寫的文章查看<a href="http://blog.yuqiyu.com/spring-cloud-eureka-provider.html" target="_blank">將微服務提供者註冊到Eureka服務中心</a>。

18. 啟用安全配置

Logging Admin的安全採用的是Spring Security提供的Basic Auth來完成。

18.1. 添加支持Spring Security

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

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

18.2. 配置安全用戶

建議採用Spring Security提供的內存方式來配置Logging Adminapplication.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可以訪問<a href="http://blog.yuqiyu.com/spring-boot-chapter27.html" target="_blank">SpringBoot使用ApplicationEvent&Listener完成業務解耦</a>。

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詳細源碼請訪問<a href="https://gitee.com/minbox-projects/api-boot/blob/master/api-boot-project/api-boot-autoconfigure/src/main/java/org/minbox/framework/api/boot/autoconfigure/logging/admin/ApiBootLoggingAdminAutoConfiguration.java" target="_blank">ApiBootLoggingAdminAutoConfiguration</a>。

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);