# III. 配置服务端

# 16. 启用服务端

minbox-logging-spring-context依赖内提供了@EnableLoggingAdmin注解来启用服务端,配置使用该注解后通过@Import自动注册Logging Admin运行时所需要的Bean

@EnableLoggingAdmin使用示例如下所示:

@SpringBootApplication
@EnableLoggingAdmin
public class ApiBootLoggingAdminApplication {
    /**
     * logger instance
     */
    static Logger logger = LoggerFactory.getLogger(ApiBootLoggingAdminApplication.class);

    public static void main(String[] args) {
        SpringApplication.run(ApiBootLoggingAdminApplication.class, args);
        logger.info("{}服务启动成功.", "Logging Admin");
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13

# 17. 初始化数据库

Logging Admin支持将Logging Client上报的请求日志保存到数据库,而且提供了固定的表结构,如下所示:

SET NAMES utf8mb4 ;
--
-- Table structure for table `logging_service_details`
--

DROP TABLE IF EXISTS `logging_service_details`;
SET character_set_client = utf8mb4 ;
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='上报日志的客户端服务详情';

--
-- Table structure for table `logging_request_logs`
--

DROP TABLE IF EXISTS `logging_request_logs`;
SET character_set_client = utf8mb4 ;
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='请求日志信息表';

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
44
45
46
47

# 17.1. 将日志持久化到数据库

初始化Logging Admin所需要的表结构之后,我们在集成Logging Admin的项目中添加数据源数据库驱动持久化框架等依赖,然后进行配置数据源相关数据库参数,下面以SpringBoot项目示例。

# 17.1.1 添加所需依赖

pom.xml新增依赖如下所示:

<!--ApiBoot提供的持久化框架-->
<dependency>
  <groupId>org.minbox.framework</groupId>
  <artifactId>api-boot-starter-mybatis-enhance</artifactId>
  <version>{ApiBoot最新版本}</version>
</dependency>
<!--MySQL数据库驱动-->
<dependency>
  <groupId>mysql</groupId>
  <artifactId>mysql-connector-java</artifactId>
  <version>8.0.17</version>
</dependency>
<!--Hikari数据源-->
<dependency>
  <groupId>com.zaxxer</groupId>
  <artifactId>HikariCP</artifactId>
  <version>3.2.0</version>
</dependency>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

Logging Admin并不固定依赖ApiBoot提供的持久化框架,可以使用任意框架依赖,Logging Admin内部只是需要DataSource的实例,也可以自定义创建DataSource对象放入Spring IOC

# 17.1.2. 配置数据源参数

spring:
  # 数据源参数
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    type: com.zaxxer.hikari.HikariDataSource
    username: root
    password: 123456
    url: jdbc:mysql://localhost:3306/test
1
2
3
4
5
6
7
8

# 18. 将Admin注册到SpringCloud

Logging Admin作为一个依赖添加到SpringBoot项目内,我们只需要考虑如何将SpringBoot项目注册到服务注册中心(SpringCloud Service Register Center),如果你使用的Eureka作为服务注册中心,请访问我之前编写的文章查看将微服务提供者注册到Eureka服务中心

# 19. 启用安全配置

Logging Admin的安全采用的是Spring Security提供的Basic Auth来完成。

# 19.1. 添加支持Spring Security

在项目的pom.xml内添加如下依赖:

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-security</artifactId>
</dependency>
1
2
3
4

# 19.2. 配置安全用户

建议采用Spring Security提供的内存方式来配置Logging Adminapplication.yml配置文件如下所示:

spring:
  security:
    user:
      # 用户名
      name: user
      # 密码
      password: 123
1
2
3
4
5
6
7

# 20. 监听日志上报事件

Logging Admin支持自定义处理监听到Logging Client上报的日志信息,可进行自定义的存储,格式化处理,分组归类等,自定义事件监听沿用了Spring Event/Listener方式,如下所示:

/**
 * 自定义上报日志事件{@link ReportLogEvent}监听
 *
 * @author 恒宇少年
 */
@Component
public class CustomerReportEventListener implements SmartApplicationListener {
    /**
     * 判断事件类型为{@link ReportLogEvent}
     *
     * @param eventType
     * @return
     */
    @Override
    public boolean supportsEventType(Class<? extends ApplicationEvent> eventType) {
        return ReportLogEvent.class == eventType;
    }

    /**
     * 自定义处理业务
     *
     * @param event
     */
    @Override
    public void onApplicationEvent(ApplicationEvent event) {
        ReportLogEvent reportLogEvent = (ReportLogEvent) event;
        LoggingClientNotice loggingClientNotice = reportLogEvent.getLogClientNotice();
        System.out.println("上报日志的服务Id:" + loggingClientNotice.getClientServiceId());
        // 自定义业务处理...
    }
}
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

# 20.1. 多监听事件实现

Logging Admin由于采用的是Spring内部提供的SmartApplicationListener方式来监听ReportLogEvent事件,所以只需要添加多个自定义监听实现SmartApplicationListener接口即可。

SmartApplicationListener由于实现了Ordered接口,所以提供优先级配置方法getOrder,与LoggingNotice接口优先级策略一致,值越小优先级越高

详细了解Spring提供的Event/Listener可以访问SpringBoot使用ApplicationEvent&Listener完成业务解耦

# 21. LoggingAdminFactoryBean

LoggingAdminFactoryBean是配置Logging Admin的必要途径,通过该类可以对Logging Admin进行全方面的配置。

ApiBoot集成Logging Admin FactoryBean示例如下所示:

/**
* instantiation {@link LoggingAdminFactoryBean}
*
* @param dataSource {@link DataSource}
* @return LoggingAdminFactoryBean
*/
@Bean
public LoggingAdminFactoryBean loggingAdminFactoryBean(DataSource dataSource) {
  LoggingAdminFactoryBean factoryBean = new LoggingAdminFactoryBean();
  factoryBean.setDataSource(dataSource);
  factoryBean.setShowConsoleReportLog(apiBootLoggingAdminProperties.isShowConsoleReportLog());
  factoryBean.setFormatConsoleLogJson(apiBootLoggingAdminProperties.isFormatConsoleLogJson());
  logger.info("【LoggingAdminFactoryBean】init successfully.");
  return factoryBean;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

ApiBoot 集成LoggingAdminFactoryBean详细源码请访问ApiBootLoggingAdminAutoConfiguration

# 21.1. 设置数据源

通过LoggingAdminFactoryBean#setDataSource方法来设置Logging Admin所需要操作日志数据的数据源,如下所示:

// 设置数据源 
factoryBean.setDataSource(dataSource);
1
2

# 21.2. 控制台输出上报的日志

通过LoggingAdminFactoryBean#setShowConsoleReportLog方法来控制是否在控制台打印Logging Client上报的日志信息,如下所示:

// 设置在控制台输出Logging Client 上报的日志
factoryBean.setShowConsoleReportLog(true);
1
2

# 21.3. 格式化控制台输出日志

通过LoggingAdminFactoryBean#setFormatConsoleLogJson方法来格式化控制台输出的日志,如下所示:

// 格式化控制台输出的日志
factoryBean.setFormatConsoleLogJson(true);
1
2
最后更新时间: 12/22/2019, 12:33:52 PM