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

經過ApiBoot Logging能夠將每一條請求的詳細信息獲取到,在分佈式部署方式中,一個請求可能會通過多個服務,若是是每一個服務都獨立保存請求日誌信息,咱們沒有辦法作到統一的控制,並且還會存在日誌數據庫業務數據庫不一致的狀況出現(可能會用到多數據源配置),正由於這個問題ApiBoot Logging提供了一個Admin的概念,將客戶端採集到的的每一條日誌都進行上報到Admin,由Admin進行分析、保存等操做。html

建立Logging Admin項目

ApiBoot Logging Admin既然能夠彙總每個業務服務(ApiBoot Logging)的請求日誌,所以咱們須要將每個業務服務採集單的日誌進行上報到Admin,因此應該使用獨立的方式進行部署,咱們單首創建一個服務來專門採集請求日誌而後進行保存。java

初始化Logging Admin項目依賴

使用idea建立一個SpringBoot項目,pom.xml配置文件內的依賴以下所示:mysql

<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容器。web

添加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:…進行查詢。spring

啓用Logging Admin

添加ApiBoot Logging Admin依賴後還不能徹底使用Admin的功能,咱們須要經過@EnableLoggingAdmin註解來啓用,該註解會自動將Logging Admin內所須要的部分類自動註冊到Spring IOC,在入口類添加註解以下所示:sql

/**
 * 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配置文件內添加以下內容:json

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

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

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

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","host":"localhost:8080","user-agent":"curl/7.64.1","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接口服務架構師

相關文章
相關標籤/搜索