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

MinBox Logging

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

零侵入式

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

源碼地址

gitee.com/minbox-proj…mysql

I. 概念

1. 鏈路架構圖

image

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

2. 提交使用中遇到的問題

遇到你在集成使用過程當中遇到了問題,請提交issues,提交地址:建立Issuesspring

3. ApiBoot集成實踐示例

ApiBoot做爲MinBox開源組織的組件最佳集成方案,在第一時間會進行整合minbox-projects開源組織內新發布的組件,MinBox Logging整合實踐請訪問ApiBoot源碼,整合源碼詳見org.minbox.framework.api.boot.autoconfigure.loggingsql

II. 配置客戶端

4. 啓用客戶端

minbox-logging-spring-context依賴內提供了@EnableLoggingClient註解來啓用客戶端,配置使用該註解後經過@Import自動註冊Logging Client運行時所須要的Bean數據庫

@EnableLoggingClient使用示例以下所示:json

@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等方式做爲主要佔比。api

鏈路信息(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實踐示例,

詳見源碼,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(端口號),並不須要添加任何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實踐示例,詳見源碼,**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;
}複製代碼

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: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
@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做爲服務註冊中心,請訪問我以前編寫的文章查看將微服務提供者註冊到Eureka服務中心

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能夠訪問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);
複製代碼

本文由博客一文多發平臺 OpenWrite 發佈!

相關文章
相關標籤/搜索