將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介面服務架構師