文档章节

将ApiBoot Logging采集的日志上报到Admin

恒宇少年
 恒宇少年
发布于 10/21 15:53
字数 2010
阅读 5
收藏 0

通过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,请访问:<a href="https://search.maven.org/search?q=a:api-boot-dependencies" target="_blank">https://search.maven.org/search?q=a:api-boot-dependencies</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控制台打印的上报请求日志,而这条请求的日志是否已经被保存到数据库了还不确定,下面我使用命令行来查看数据库的日志信息。

查看logging_service_details表内数据

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进行确定唯一性,同一个服务只进行保存一次。

查看logging_request_logs表内数据

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接口服务架构师

© 著作权归作者所有

恒宇少年

恒宇少年

粉丝 14
博文 28
码字总数 46472
作品 3
济南
高级程序员
私信 提问
ApiBoot 2.1.2.RELEASE 发布,引入链路式日志组件 Admin

ApiBoot为接口服务而生,基于SpringBoot完成扩展、自动化配置,通过封装一系列Starter来让调用者快速集成组件,降低学习、使用门槛,提高开发效率。 ApiBoot 官网 官网地址:http://apiboot....

恒宇少年
07/24
2.4K
4
MinBox Logging 1.0.1.RELEASE 发布,分布式链路日志

是一款分布式、零侵入式的链路日志分析框架,支持 微服务架构下配置使用,内部封装了 、 两种方式透传链路信息。 零侵入式 无需使用注解配置采集链路日志,只需要添加 后简单配置 的相关 或 ...

恒宇少年
09/17
1K
0
ApiBoot 2.1.3发布,支持 Logging Admin 界面管理

ApiBoot 为接口服务而生,基于 SpringBoot 完成扩展、自动化配置,通过封装一系列 Starter 来让调用者快速集成组件,降低学习、使用门槛,提高开发效率。 从 版本开始,内的全部会从模块从陆...

恒宇少年
08/15
3.5K
0
分布式链路日志组件 minbox-logging 初版发布

MinBox Logging 是一款分布式、零侵入式的链路日志分析框架,支持 微服务架构下配置使用,内部封装了 、 两种方式透传链路信息。 零侵入式 无需使用注解配置采集链路日志,只需要添加 后简单...

恒宇少年
09/05
1K
6
ApiBoot 2.1.5.RELEASE 发布,接口服务落地解决方案

简介 ApiBoot是接口服务的落地解决方案,提供了一系列开箱即用的组件,通过封装来简化主流第三方框架的集成,从而提高开发者开发效率、学习成本、降低入门门槛,真正的实现开箱即用!!! 对...

恒宇少年
11/06
2.5K
0

没有更多内容

加载失败,请刷新页面

加载更多

前端的一些雕虫小技,从100%和滚动条说起

1、100%和滚动条 当我们在css中把html和body同时设为100%时,会出现滚动条 html, body { width: 100%; height: 100%; } 原因是html和b...

wphmoon
32分钟前
6
0
电力区块链应用案例【2019】

随着区块链技术的日益普及,出现了大量创业企业尝试使用区块链技术来解决能源与电力行业中存在的问题。在本文中,我们将介绍其中的三个能源区块链项目。 能源行业以价格不透明著称:消费者很...

汇智网教程
53分钟前
7
0
聊聊rocketmq的adjustThreadPoolNumsThreshold

序 本文主要研究一下rocketmq的adjustThreadPoolNumsThreshold DefaultMQPushConsumer rocketmq-client-4.5.2-sources.jar!/org/apache/rocketmq/client/consumer/DefaultMQPushConsumer.ja......

go4it
今天
9
0
关于早起

早起是非常好的事情,但是像如果前一天睡得晚,或者第二天早上是非常冷的时候,那就不是很美好了。 但是本身早起是一件非常棒的事情,我记得我每次早起 如果不觉得困的话,世界是那么安静,脑...

T型人才追梦者
今天
7
0
Java输入输出

JDK中的InputStream/OutputStream构成了IO输入输出继承层次的基础。它们都是面向字节序列的,每次可以从序列中读入或者写出一个字节或者指定大小的字节数组。但是面向字节流的输入输出不便于...

ytuan996
今天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部