# 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");
}
}
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='请求日志信息表';
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>
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
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>
2
3
4
# 19.2. 配置安全用户
建议采用Spring Security
提供的内存方式
来配置Logging Admin
,application.yml
配置文件如下所示:
spring:
security:
user:
# 用户名
name: user
# 密码
password: 123
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());
// 自定义业务处理...
}
}
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;
}
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);
2
# 21.2. 控制台输出上报的日志
通过LoggingAdminFactoryBean#setShowConsoleReportLog
方法来控制是否在控制台打印Logging Client
上报的日志信息,如下所示:
// 设置在控制台输出Logging Client 上报的日志
factoryBean.setShowConsoleReportLog(true);
2
# 21.3. 格式化控制台输出日志
通过LoggingAdminFactoryBean#setFormatConsoleLogJson
方法来格式化控制台输出的日志,如下所示:
// 格式化控制台输出的日志
factoryBean.setFormatConsoleLogJson(true);
2