經過ApiBoot Logging
能夠將每一條請求的詳細信息獲取到,在分佈式部署方式中,一個請求可能會通過多個服務,若是是每一個服務都獨立保存
請求日誌信息,咱們沒有辦法作到統一的控制,並且還會存在日誌數據庫
與業務數據庫
不一致的狀況出現(可能會用到多數據源配置),正由於這個問題ApiBoot Logging
提供了一個Admin
的概念,將客戶端採集到的的每一條日誌都進行上報到Admin
,由Admin
進行分析、保存等操做。html
ApiBoot Logging Admin
既然能夠彙總每個業務服務
(ApiBoot Logging)的請求日誌,所以咱們須要將每個業務服務
採集單的日誌進行上報到Admin
,因此應該使用獨立的方式進行部署,咱們單首創建一個服務來專門採集請求日誌而後進行保存。java
使用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
<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
添加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
。
咱們將修改使用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接口服務架構師