1. 程式人生 > 程式設計 >將ApiBoot Logging採集的日誌上報到Admin

將ApiBoot Logging採集的日誌上報到Admin

通過ApiBoot Logging可以將每一條請求的詳細資訊獲取到,在分散式部署方式中,一個請求可能會經過多個服務,如果是每個服務都獨立儲存請求日誌資訊,我們沒有辦法做到統一的控制,而且還會存在日誌資料庫業務資料庫不一致的情況出現(可能會用到多資料來源配置),正因為這個問題ApiBoot Logging提供了一個Admin的概念,將客戶端採集到的的每一條日誌都進行上報到Admin,由Admin進行分析、儲存等操作。

建立Logging Admin專案

ApiBoot Logging Admin既然可以彙總每一個業務服務(ApiBoot Logging)的請求日誌,因此我們需要將每一個業務服務

採集單的日誌進行上報到Admin,所以應該使用獨立的方式進行部署,我們單獨建立一個服務來專門採集請求日誌然後進行儲存。

初始化Logging Admin專案依賴

使用idea建立一個SpringBoot專案,pom.xml配置檔案內的依賴如下所示:

<dependencies>
  <!--Web-->
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
  </dependency>
  <!--ApiBoot Logging Admin-->
  <dependency>
    <groupId>org.minbox.framework</groupId>
    <artifactId>api-boot-starter-logging-admin</artifactId>
  </dependency>
  <!--MySQL-->
  <dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
  </dependency>
  <dependency>
    <groupId>com.zaxxer</groupId>
    <artifactId>HikariCP</artifactId>
  </dependency>
  <!--ApiBoot MyBatis Enhance-->
  <dependency>
    <groupId>org.minbox.framework</groupId>
    <artifactId>api-boot-starter-mybatis-enhance</artifactId>
  </dependency>
</dependencies>複製程式碼

我們需要將採集到的請求日誌進行儲存到資料庫,所以在專案內需要新增資料庫驅動資料庫連線池相關的依賴,ApiBoot Logging Admin內部通過DataSource進行操作資料,通過ApiBoot MyBatis Enhance的依賴可以自動化建立DataSource,擺脫手動建立並加入Spring IOC容器。

新增ApiBoot統一版本依賴

<dependencyManagement>
  <dependencies>
    <!--ApiBoot統一版本依賴-->
    <dependency>
      <groupId>org.minbox.framework</groupId>
      <artifactId>api-boot-dependencies</artifactId>
      <version>2.1.4.RELEASE</version>
      <scope>import</scope>
      <type>pom</type>
    </dependency>
  </dependencies>
</dependencyManagement>複製程式碼

最新版的ApiBoot,請訪問:search.maven.org/search?q=a:…進行查詢。

啟用Logging Admin

新增ApiBoot Logging Admin依賴後還不能完全使用Admin的功能,我們需要通過@EnableLoggingAdmin註解來啟用,該註解會自動將Logging Admin內所需要的部分類自動註冊到Spring IOC,在入口類新增註解如下所示:

/**
 * ApiBoot Logging Admin入口類
 */
@SpringBootApplication
@EnableLoggingAdmin
public class ApibootReportLogsByLoggingToAdminApplication {

  public static void main(String[] args) {
    SpringApplication.run(ApibootReportLogsByLoggingToAdminApplication.class,args);
  }

}複製程式碼

配置日誌資料來源

application.yml配置檔案內資料來源配置如下所示:

# 服務名稱
spring:
  application:
    name: apiboot-report-logs-by-logging-to-admin
  # 資料來源相關配置
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/test
    username: root
    password: 123456
    type: com.zaxxer.hikari.HikariDataSource
# 服務埠號
server:
  port: 8081複製程式碼

控制檯列印上報日誌

ApiBoot Logging Admin可以通過配置檔案的方式進行控制是否在控制檯列印採集到的請求日誌資訊,在application.yml配置檔案內新增如下內容:

api:
  boot:
    logging:
      # Logging Admin相關配置
      admin:
        # 控制檯顯示採集的日誌資訊
        show-console-report-log: true複製程式碼

注意:這裡不要跟ApiBoot Logging所提供的api.boot.logging.show-console-log配置混淆。

美化控制檯列印的上報日誌

api:
  boot:
    logging:
      # Logging Admin相關配置
      admin:
        # 控制檯輸出時美化採集到的日誌
        format-console-log-json: true複製程式碼

注意:這裡不要跟api.boot.logging.format-console-log-json配置混淆。

初始化日誌表結構

ApiBoot Logging Admin內部通過固定的表結構來進行儲存請求日誌服務資訊,建表語句如下所示:

SET NAMES utf8mb4 ;

--
-- Table structure for table `logging_request_logs`
--

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='請求日誌資訊表';

--
-- Table structure for table `logging_service_details`
--

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='上報日誌的客戶端服務詳情';
複製程式碼

ApiBoot Logging Admin目前為止已經準備完畢,接下來我們需要修改業務服務將請求日誌上報到Logging Admin

上報日誌到指定Logging Admin

我們將修改使用ApiBoot Logging進行統一管理請求日誌文章原始碼,在application.yml新增Logging Admin的地址,如下所示:

api:
  boot:
    # ApiBoot Logging 日誌元件配置
    logging:
      # 配置Logging Admin地址
      admin:
        server-address: 127.0.0.1:8081複製程式碼

api.boot.logging.admin-service-address的配置格式為:Ip:Port,我們只需要修改這一個地方即可,其他的工作都交付給ApiBoot Logging內部完成。

測試

我們將ApiBoot Logging Admin以及業務服務通過Application的形式進行啟動。

使用curl訪問測試地址如下所示:

~ curl http://localhost:8080/test\?name\=admin
你好:admin複製程式碼

我們檢視ApiBoot Logging Admin控制檯日誌如下所示:

Receiving Service: 【apiboot-unified-manage-request-logs -> 127.0.0.1】,Request Log Report,Logging Content:[
    {
        "endTime":1571641723779,"httpStatus":200,"requestBody":"","requestHeaders":{
            "server-region":"JiNan","host":"localhost:8080","user-agent":"curl/7.64.1","accept":"*/*"
        },"requestIp":"0:0:0:0:0:0:0:1","requestMethod":"GET","requestParam":"{\"name\":\"admin\"}","requestUri":"/test","responseBody":"你好:admin","responseHeaders":{},"serviceId":"apiboot-unified-manage-request-logs","serviceIp":"127.0.0.1","servicePort":"8080","spanId":"95a73ca0-831b-45df-aa43-2b5887e8d98d","startTime":1571641723776,"timeConsuming":3,"traceId":"25a7de96-b3dd-48e5-9854-1a8069a4a681"
    }
]複製程式碼

我們已經看到了Logging Admin控制檯列印的上報請求日誌,而這條請求的日誌是否已經被儲存到資料庫了還不確定,下面我使用命令列來檢視資料庫的日誌資訊。

檢視loggingservicedetails表內資料

mysql> select * from logging_service_details\G;
*************************** 1. row ***************************
              lsd_id: b069366a-25dc-41ec-8f09-242d81755cd0
      lsd_service_id: apiboot-unified-manage-request-logs
      lsd_service_ip: 10.180.98.112
    lsd_service_port: 8080
lsd_last_report_time: 2019-10-21 02:14:26
     lsd_create_time: 2019-10-21 15:14:26複製程式碼

logging_service_details存放了每一個上報請求日誌的業務服務基本資訊,每一個服務基本資訊會在Logging Admin記憶體中快取一份,方便獲取service_id進行儲存日誌,根據ip+port+service_id進行確定唯一性,同一個服務只進行儲存一次。

檢視loggingrequestlogs表內資料

mysql> select * from logging_request_logs\G;
*************************** 1. row ***************************
               lrl_id: c42761f6-b072-4744-8a17-d8e6097b85de
lrl_service_detail_id: b069366a-25dc-41ec-8f09-242d81755cd0
         lrl_trace_id: 055329a0-cfc1-4606-baf0-4fb0cc905ba2
   lrl_parent_span_id: NULL
          lrl_span_id: aab83092-7749-4f88-8cb6-a949cc060197
       lrl_start_time: 1571642065262
         lrl_end_time: 1571642065286
      lrl_http_status: 200
     lrl_request_body: 
  lrl_request_headers: {"server-region":"JiNan","accept":"*/*"}
       lrl_request_ip: 0:0:0:0:0:0:0:1
   lrl_request_method: GET
      lrl_request_uri: /test
    lrl_response_body: 你好:admin
 lrl_response_headers: {}
   lrl_time_consuming: 24
      lrl_create_time: 2019-10-21 15:14:26
   lrl_request_params: {"name":"admin"}
  lrl_exception_stack: NULL複製程式碼

敲黑板畫重點

本章我們進行集成了ApiBoot Logging Admin,將業務服務的每一次請求日誌都進行上報到Logging Admin,通過資料庫的方式進行儲存請求日誌,然後也可以通過其他的方式,而且可以通過spanId以及traceId檢視每一條請求鏈路的日誌上下級關係以及每一個請求內耗時最多的span,可以精準的進行優化服務效能。

作者個人 部落格

使用開源框架 ApiBoot 助你成為Api介面服務架構師