创建LoggingAdmin项目ApiBootLogging项目依赖使用idea(组图)

优采云 发布时间: 2021-08-19 05:25

  创建LoggingAdmin项目ApiBootLogging项目依赖使用idea(组图)

  可以通过ApiBoot Logging获取每个请求的详细信息。在分布式部署模式下,一个请求可能经过多个服务。如果每个服务独立保存请求日志信息,我们是做不到的。统一控制,日志库和业务库会出现不一致(可能会使用多个数据源配置),因为这个问题ApiBoot Logging提供了Admin的概念,客户端采集到每个日志都报给管理员,管理员会分析、保存等操作。

  创建日志管理项目

  ApiBoot Logging Admin可以汇总各个业务服务的请求日志(ApiBoot Logging),所以我们需要将各个业务服务的日志采集单上报给Admin,所以我们应该使用独立的方式进行部署。创建单独的服务专门采集请求日志然后保存。

  初始化日志管理项目依赖

  使用idea创建一个SpringBoot项目,pom.xml配置文件中的依赖如下:

  1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

  

org.springframework.boot

spring-boot-starter-web

org.minbox.framework

api-boot-starter-logging-admin

mysql

mysql-connector-java

com.zaxxer

HikariCP

org.minbox.framework

api-boot-starter-mybatis-enhance

  我们需要将采集收到的请求日志保存到数据库中,所以需要在项目中添加数据库驱动和数据库连接池相关的依赖。 ApiBoot Logging Admin 通过DataSource 操作数据,依赖ApiBoot MyBatis Enhance。可以自动创建DataSource,摆脱手动创建,加入Spring IOC容器。

  添加ApiBoot统一版本依赖

  1

2

3

4

5

6

7

8

9

10

11

12

  

org.minbox.framework

api-boot-dependencies

2.1.4.RELEASE

import

pom

  最新版本的ApiBoot请访问::api-boot-dependencies查询。

  启用日志管理

  添加ApiBoot Logging Admin依赖后,无法完全使用Admin功能。我们需要通过@EnableLoggingAdmin 注释来启用它。这个注解会自动将Logging Admin中需要的一些类注册到Spring IOC中,并在入口类中添加注解如下图:

  1

2

3

4

5

6

7

8

9

10

11

12

  /**

* ApiBoot Logging Admin入口类

*/

@SpringBootApplication

@EnableLoggingAdmin

public class ApibootReportLogsByLoggingToAdminApplication {

public static void main(String[] args) {

SpringApplication.run(ApibootReportLogsByLoggingToAdminApplication.class, args);

}

}

  配置日志数据源

  application.yml 配置文件中的数据源配置如下:

  1

2

3

4

5

6

7

8

9

10

11

12

13

14

  # 服务名称

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配置文件中添加如下内容:

  1

2

3

4

5

6

7

  api:

boot:

logging:

# Logging Admin相关配置

admin:

# 控制台显示采集的日志信息

show-console-report-log: true

  注意:这不应与 ApiBoot Logging 提供的 api.boot.logging.show-console-log 配置混淆。

  美化控制台打印的报告日志

  1

2

3

4

5

6

7

  api:

boot:

logging:

# Logging Admin相关配置

admin:

# 控制台输出时美化采集到的日志

format-console-log-json: true

  注意:不要与这里的 api.boot.logging.format-console-log-json 配置混淆。

  初始化日志表结构

  ApiBoot Logging Admin 使用固定的表结构来存储请求日志和服务信息。建表语句如下:

  1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

  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` (

`*敏*感*词*_id` varchar(36) COLLATE utf8mb4_general_ci NOT NULL,

`*敏*感*词*_service_id` varchar(200) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '上报服务的ID,对应spring.application.name配置值',

`*敏*感*词*_service_ip` varchar(50) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '上报服务的IP地址',

`*敏*感*词*_service_port` int(11) DEFAULT NULL COMMENT '上报服务的端口号',

`*敏*感*词*_last_report_time` timestamp NULL DEFAULT NULL COMMENT '最后一次上报时间,每次上报更新',

`*敏*感*词*_create_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '首次上报时创建时间',

PRIMARY KEY (`*敏*感*词*_id`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='上报日志的客户端服务详情';

  ApiBoot Logging Admin 到目前为止已经准备就绪。接下来,我们需要修改业务服务以将请求日志报告给 Logging Admin。

  向指定的日志管理员报告日志

  我们将修改使用ApiBoot Logging统一管理请求日志文章的源码,并将Logging Admin的地址添加到application.yml中,如下图:

  1

2

3

4

5

6

7

  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 日志管理和业务服务。

  使用curl访问测试地址如下:

  1

2

  ~ curl http://localhost:8080/test\?name\=admin

你好:admin

  我们检查 ApiBoot Logging 管理控制台日志如下:

  1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

  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控制台打印的报告请求日志,这个请求的日志是否已经保存到数据库中还不确定。接下来,我将使用命令行查看数据库的日志信息。

  查看logging_service_details表中的数据

  1

2

3

4

5

6

7

8

  mysql> select * from logging_service_details\G;

*************************** 1. row ***************************

*敏*感*词*_id: b069366a-25dc-41ec-8f09-242d81755cd0

*敏*感*词*_service_id: apiboot-unified-manage-request-logs

*敏*感*词*_service_ip: 10.180.98.112

*敏*感*词*_service_port: 8080

*敏*感*词*_last_report_time: 2019-10-21 02:14:26

*敏*感*词*_create_time: 2019-10-21 15:14:26

  logging_service_details 存储了每个上报请求日志的业务服务的基本信息。每个服务的基本信息都会缓存在Logging Admin内存中,方便获取service_id用于存储日志,根据ip+port+service_id确定唯一性。同一个服务只保存一次。

  查看logging_request_logs表中的数据

  1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

  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查看日志——每个请求链路的从属关系以及每个请求中消耗时间最多的跨度,以准确优化*敏*感*词*能。

  代码示例

  如果你喜欢这篇文章文章请为源代码仓库点个Star,谢谢! ! !

  这个文章例子的源码可以通过以下方式获取,目录为apiboot-report-logs-by-logging-to-admin:

  本文由恒宇青年-于启宇撰写,遵循CC4.0BY-SA版权协议。转载请注明文章source。如需公众号转载请联系“微信”

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线