MinBox Logging
是一款分佈式、零侵入式的鏈路日誌分析框架,支持SpringCloud
微服務架構下配置使用,內部封裝了RestTemplate
、OpenFeign
兩種方式透傳鏈路信息。html
MinBox Logging
無需使用註解配置採集鏈路日誌,只須要添加依賴
後簡單配置Minbox Loggin Admin
的相關地址
或服務名稱
便可,每次在收到請求時就會把請求對應的鏈路日誌詳細信息自動上報到MinBox Logging Admin
進行後續分析、告警通知等。java
在一次請求中,通過的每個服務(MicroService)
的鏈路編號(TraceId)
保持一致,經過SpanID
、ParentSpanID
進行鏈路上下級關係銜接。git
遇到你在集成使用過程當中遇到了問題,請提交issues,提交地址:建立Issuesspring
ApiBoot
做爲MinBox
開源組織的組件最佳集成方案,在第一時間會進行整合minbox-projects開源組織內新發布的組件,MinBox Logging
整合實踐請訪問ApiBoot
源碼,整合源碼詳見org.minbox.framework.api.boot.autoconfigure.logging
。sql
在minbox-logging-spring-context
依賴內提供了@EnableLoggingClient
註解來啓用客戶端,配置使用該註解後經過@Import
自動註冊Logging Client
運行時所須要的Bean
。數據庫
@EnableLoggingClient使用示例以下所示:json
@SpringBootApplication
@EnableLoggingClient
public class ApiBootLoggingApplication {
/**
* logger instance
*/
static Logger logger = LoggerFactory.getLogger(ApiBootLoggingApplication.class);
public static void main(String[] args) {
SpringApplication.run(ApiBootLoggingApplication.class, args);
logger.info("{}服務啓動成功.", "ApiBoot Logging Client");
}
}複製代碼
每發送一個請求時就會產生一條鏈路信息,而鏈路單元(Span)以前的相互訪問目前則以http
、rpc
等方式做爲主要佔比。api
鏈路信息(Trace)的傳遞,Logging Client
內部提供了提取請求header
內的鏈路信息編號(TraceID)、上級單元編號(Parent SpanID),整條鏈路都經過這種方式來進行上下級單元關係、鏈路關係綁定。數組
RestTemplate
是Spring Web
組件提供的請求封裝對象,可用於發送指定方式的請求到目標地址,可攜帶header
信息進行傳遞身份認證信息、請求、響應等信息。
Logging Client
則是利用RestTemplate
的攔截器將鏈路(Trace)信息寫入請求的header
進行傳遞到下一個單元(Span)。
Logging Client
已經提供了RestTemplate
攔截器實現類LoggingRestTemplateInterceptor
,在LoggingFactoryBean#afterPropertiesSet
方法內進行實例化而且已經設置了攔截器,在Logging Client
上報請求日誌信息時,都是經過LoggingFactoryBean#restTemplate
來執行發送請求到Admin
,所以只須要實例化LoggingFactoryBean
便可。
OpenFeign
是SpringCloud
爲服務之間方法相互調用的實現方式,根據接口配置信息來發送請求並獲取響應內容。
Logging Client
一樣是利用OpenFeign
提供的攔截器將鏈路(Trace)信息寫入服務相互調用的請求header
,進行傳遞到下一個服務。
Logging Client
內部提供了RequestInterceptor
接口實現類LoggingOpenFeignInterceptor
來完成鏈路信息透傳,OpenFeign
會自動檢索Spring IOC
容器內RequestInterceptor
接口的實現類實例,每次經過OpenFeign
發起請求時會調用RequestInterceptor
實現類的apply
方法來完成攔截業務處理。
Logging Client
默認本地不進行持久化存儲請求日誌
信息,而是將本地生成的請求日誌
詳細信息上報到Logging Admin
,由Admin
進行存儲、分析等。
Logging Client
內部提供LoggingAdminDiscovery#lookup
接口方法來進行發現Admin地址。
Logging Client
獲取指定Admin
地址是經過LoggingAdminDiscovery
其中一個實現類LoggingAppointAdminDiscovery
來進行獲取。
下面是ApiBoot
配置使用LoggingAppointAdminDiscovery實踐示例,
詳見源碼,ApiBootLoggingAdminAppointAutoConfiguration:
/**
* ApiBoot Logging Admin Config Discovery
* Multiple Use "," Separation
*
* @return LoggingAdminDiscovery
*/
@Bean
@ConditionalOnMissingBean
public LoggingAppointAdminDiscovery loggingConfigAdminDiscovery() {
String[] adminAddressArray = apiBootLoggingProperties.getAdmin().getServerAddress().split(",");
LoggingAppointAdminDiscovery appointAdminDiscovery = new LoggingAppointAdminDiscovery(adminAddressArray);
return appointAdminDiscovery;
}複製代碼
LoggingAppointAdminDiscovery
構造函數需提供Logging Admin
地址數組,格式爲:ip(IP地址):port(端口號)
,並不須要添加任何http
、https
前綴。
若是咱們在建立LoggingAppointAdminDiscovery
對象時傳遞了多個Logging Admin
地址,好比:
@Bean
@ConditionalOnMissingBean
public LoggingAppointAdminDiscovery loggingConfigAdminDiscovery() {
// 初始化Logging Admin地址列表
String[] adminAddressArray = {"127.0.0.1:8080,127.0.0.1:9090"};
LoggingAppointAdminDiscovery appointAdminDiscovery = new LoggingAppointAdminDiscovery(adminAddressArray);
return appointAdminDiscovery;
}複製代碼
如上所示,我啓動了兩個Logging Admin
來進行接收Logging Client
採集到的請求日誌信息後執行存儲,而Logging Client
具體使用什麼LoadBlanace
(負載均衡)策略來進行選擇上報的Logging Admin
節點?
Logging Client
提供了LoadBalanceStrategy
負載均衡策略接口,而內部提供了兩種策略的實現,分別是:RandomWeightedStrategy
、SmoothWeightedRoundRobinStrategy
。
Logging Client默認採用SmoothWeightedRoundRobinStrategy(平滑輪詢權重)負載均衡策略。
雖然LoggingAppointAdminDiscovery
在構造函數內默認實例化了平滑輪詢負載策略
,咱們固然能夠經過LoggingAppointAdminDiscovery#setLoadBalanceStrategy
方法來進行設置具體的策略,隨機權重策略
設置方式以下所示:
@Bean
@ConditionalOnMissingBean
public LoggingAppointAdminDiscovery loggingConfigAdminDiscovery() {
// 初始化Logging Admin地址列表
String[] adminAddressArray = {"127.0.0.1:8080,127.0.0.1:9090"};
LoggingAppointAdminDiscovery appointAdminDiscovery = new LoggingAppointAdminDiscovery(adminAddressArray);
// 實例化隨機權重策略
RandomWeightedStrategy randomWeightedStrategy = new RandomWeightedStrategy();
// 設置負載均衡策略
appointAdminDiscovery.setLoadBalanceStrategy(randomWeightedStrategy);
return appointAdminDiscovery;
}複製代碼
RandomWeightedStrategy(隨機權重負載策略)是隨機分配選擇指定的Logging Admin
地址,在上面示例中,隨機權重的結果可能爲:
隨機權重獲取到的 Logging Admin 地址:
127.0.0.1:8080
127.0.0.1:8080
127.0.0.1:9090
127.0.0.1:8080
127.0.0.1:9090
127.0.0.1:9090
127.0.0.1:9090複製代碼
SmoothWeightedRoundRobinStrategy(平滑輪詢權重負載策略)是平滑分配指定的Logging Admin
地址,在上面示例中,平滑輪詢權重的結果爲:
平滑輪詢權重獲取到的 Logging Admin 地址:
127.0.0.1:8080
127.0.0.1:9090
127.0.0.1:8080
127.0.0.1:9090
127.0.0.1:8080
127.0.0.1:9090複製代碼
在SpringCloud MicroService
部署方式下使用時,能夠將Logging Admin
做爲一個單獨的服務進行註冊到Service Registry Center
(服務註冊中心,如:Eureka
、Zookeeper
、Consul
、Nacos Discovery
等),這樣在Logging Client
經過服務註冊的發現接口便可完成Logging Admin
的發現,獲取地址後進行上報請求日誌
。
Logging Client
內部提供了集成服務註冊中心
的服務發現實現LoggingRegistryCenterAdminDiscovery
,經過配置實例化該類並放入Spring IOC
便可完成自動從服務註冊中心
內獲取Logging Admin
信息。
ApiBoot
配置使用LoggingRegistryCenterAdminDiscovery實踐示例,詳見源碼,**ApiBootLoggingAdminDiscoveryAutoConfiguration**。
/**
* ApiBoot Logging Admin Registry Center Discovery
* @param loadBalancerClient LoadBalance Client
* @return LoggingRegistryCenterAdminDiscovery
*/
@Bean
@ConditionalOnMissingBean
public LoggingRegistryCenterAdminDiscovery loggingRegistryCenterAdminDiscovery(LoadBalancerClient loadBalancerClient) {
LoggingRegistryCenterAdminDiscovery registryCenterAdminDiscovery =
new LoggingRegistryCenterAdminDiscovery(apiBootLoggingProperties.getDiscovery().getServiceId(), loadBalancerClient);
return registryCenterAdminDiscovery;
}複製代碼
LoadBalancerClient是SpringCloud
負載均衡客戶端對象,經過SpringCloud
依賴的自動配置而且放入Spring IOC
,注入該對象後便可負載均衡的發現一個可用的指定serviceID
的服務對象ServiceInstance
。
Logging Client
默認採用了just
(直接上報)的方式來上報採集到的請求日誌
,每產生一條請求日誌都會實時上報到Logging Admin
,而有些時候需求每每變化比較大,好比:下降Logging Admin
壓力,這時可能每次上報20條請求日誌
到Logging Admin
。
針對這種業務狀況,Logging Client
提供了定時上報方式。
上報方式
經過LoggingFactoryBean#setReportAway
方法來修改默認值,參數爲org.minbox.framework.logging.core.ReportAway
枚舉,修改以下所示:
// 設置上報方式爲:timing
factoryBean.setReportAway(ReportAway.timing);複製代碼
單次上報請求日誌數量默認值爲:10
。
經過LoggingFactoryBean#setNumberOfRequestLog
方法來修改默認值,以下所示:
// 設置每次上報的請求日誌數量
factoryBean.setNumberOfRequestLog(20);
複製代碼
上報日誌默認間隔時間爲:5秒
。
經過LoggingFactoryBean#setReportIntervalSecond
方法來修改默認值,以下所示:
// 設備上報間隔時間,單位:秒
factoryBean.setReportIntervalSecond(5);
複製代碼
Logging Client
默認使用UUID
生成的字符串做爲TraceId
(鏈路編號),經過LoggingFactoryBean#setTraceGenerator
方法來修改默認的生成規則,自定義策略須要實現LoggingTraceGenerator
接口,以下所示:
/**
* 自定義鏈路編號(TraceID){@link LoggingTraceGenerator}
*
* @author 恆宇少年
*/
public class CustomerTraceIdGenerator implements LoggingTraceGenerator {
@Override
public String createTraceId() throws MinBoxLoggingException {
return UUID.randomUUID().toString().replace("-", "");
}
}
複製代碼
設置使用自定義的策略以下所示:
// 建立自定義策略對象
CustomerTraceIdGenerator customerTraceIdGenerator = new CustomerTraceIdGenerator();
// 設置使用自定義生成TraceID的策略
factoryBean.setTraceGenerator(customerTraceIdGenerator);
複製代碼
Logging Client
默認使用UUID
生成的字符串做爲SpanId
(單元編號),經過LoggingFactoryBean#setSpanGenerator
方法來修改默認的生成規則,自定義策略須要實現LoggingSpanGenerator
接口,以下所示:
/**
* 自定義單元編號(SpanID){@link LoggingSpanGenerator}
*
* @author 恆宇少年
*/
public class CustomerSpanIdGenerator implements LoggingSpanGenerator {
@Override
public String createSpanId() throws MinBoxLoggingException {
String currentTime = String.valueOf(System.currentTimeMillis());
return String.format("%s-%s", "span", currentTime);
}
}
複製代碼
設置使用自定義策略以下所示:
// 建立自定義策略對象
CustomerSpanIdGenerator customerSpanIdGenerator = new CustomerSpanIdGenerator();
// 設置使用自定義生成SpanID的策略
factoryBean.setSpanGenerator(customerSpanIdGenerator);
複製代碼
Logging Client
內默認排除了/error
路徑不進行上報日誌,若是業務服務存在一些訪問比較頻繁的接口,並且接口並不涉及業務請求,那麼建議將這些請求進行排除,好比:集成SpringBootAdmin
後會頻繁訪問/actuator/health
來檢查服務的健康程度。
經過LoggingFactoryBean#setIgnorePaths
方法進行追加排除路徑
,這裏注意是追加而不是替換,因此/error
始終是在排除的列表內,配置排除路徑以下所示:
// 須要排除的路徑列表
String[] ignorePaths = new String[]{
"/actuator/health",
"/index",
"/test"
};
// 設置排除的路徑列表
factoryBean.setIgnorePaths(ignorePaths);
複製代碼
分佈式的日誌採集與日誌存儲定然會存在安全性問題,那麼在Logging Admin
服務端已經解決了這個問題,Logging Admin
經過集成Spring Security
配置用戶名、密碼來完成Basic Auth
認證。
在Logging Client
發起上報請求時,會提取Logging Admin
路徑內的Basic Auth
認證信息,經過header
形式進行傳遞認證信息。
若是採用的是LoggingAppointAdminDiscovery
方式配置Logging Admin
服務地址發現,那麼在構造函數初始化Logging Admin
地址時,須要攜帶Basic Auth
的用戶名、密碼信息,以下所示:
@Bean
@ConditionalOnMissingBean
public LoggingAppointAdminDiscovery loggingConfigAdminDiscovery() {
// 初始化Logging Admin地址列表
String[] adminAddressArray = {"user:123@127.0.0.1:8080,user:123@127.0.0.1:9090"};
LoggingAppointAdminDiscovery appointAdminDiscovery = new LoggingAppointAdminDiscovery(adminAddressArray);
return appointAdminDiscovery;
}
複製代碼
在上面示例中能夠看到Basic Auth
是經過username:password@IP:Port
格式來進行配置,其中user
爲用戶名,而123
則是該用戶的密碼。
若是採用LoggingRegistryCenterAdminDiscovery
方式配置Logging Admin
服務地址發現,配置以下所示:
/**
* ApiBoot Logging Admin Registry Center Discovery
* setting basic auth username if not empty {@link LoggingRegistryCenterAdminDiscovery#setUsername(String)}
* setting basic auth password if not empty {@link LoggingRegistryCenterAdminDiscovery#setPassword(String)}
*
* @param loadBalancerClient LoadBalance Client
* @return LoggingRegistryCenterAdminDiscovery
*/
@Bean
@ConditionalOnMissingBean
public LoggingRegistryCenterAdminDiscovery loggingRegistryCenterAdminDiscovery(LoadBalancerClient loadBalancerClient) {
LoggingRegistryCenterAdminDiscovery registryCenterAdminDiscovery =
new LoggingRegistryCenterAdminDiscovery(apiBootLoggingProperties.getDiscovery().getServiceId(), loadBalancerClient);
// 用戶名
String basicAuthUserName = apiBootLoggingProperties.getDiscovery().getUsername();
if (ObjectUtils.isEmpty(basicAuthUserName)) {
registryCenterAdminDiscovery.setUsername(basicAuthUserName);
}
// 密碼
String basicAuthPassword = apiBootLoggingProperties.getDiscovery().getPassword();
if (!ObjectUtils.isEmpty(basicAuthPassword)) {
registryCenterAdminDiscovery.setPassword(basicAuthPassword);
}
return registryCenterAdminDiscovery;
}
複製代碼
上面示例所示,根據LoggingRegistryCenterAdminDiscovery#setUsername
方法來設置用戶名,根據LoggingRegistryCenterAdminDiscovery#setPassword
方法來設置密碼。
Logging Client
默認不會在控制檯打印即將要上報的請求日誌
信息,能夠經過LoggingFactiory#setShowConsoleLog
方法進行設置,以下所示:
// 設置在控制檯輸出上報的日誌
factoryBean.setShowConsoleLog(true);
複製代碼
Logging Client
在控制檯打印上報的請求日誌時,默認不進行格式化json
字符串,根據LoggingFactoryBean#setFormatConsoleLog
方法來進行設置,以下所示:
// 設置格式化輸出上報的日誌
factoryBean.setFormatConsoleLog(true);
複製代碼
Logging Client
提供日誌上報通知功能,只須要實現LoggingNotice
接口便可獲取每次上報的請求日誌詳細對象
,進行日誌的自定義處理,以下所示:
/**
* 自定義日誌通知
* @author 恆宇少年
*/
@Component
public class CustomerLoggingNotice implements LoggingNotice {
/**
* 通知方法
* 處理自定義的業務邏輯
* @param minBoxLog
*/
@Override
public void notice(MinBoxLog minBoxLog) {
System.out.println(minBoxLog.getTraceId());
// 自定義業務處理...
}
/**
* 通知執行優先級
* {@link #getOrder()}方法返回值值越小優先級越高
*
* @return
*/
@Override
public int getOrder() {
return 1;
}
}
複製代碼
Logging Client
內部提供了日誌通知的具體實現,分別是:LoggingLocalNotice
,LoggingAdminNotice
。
日誌通知實現類 |
功能做用 |
---|---|
LoggingLocalNotice | LoggingLocalNotice 日誌通知用於在控制檯顯示、格式化 日誌對象詳細信息,優先級爲Integer.MIN_VALUE ,源碼詳見org.minbox.framework.logging.client.notice.support.LoggingLocalNotice 。 |
LoggingAdminNotice | LoggingAdminNotice 日誌通知用於上報日誌 信息到Logging Admin ,優先級爲Integer.MIN_VALUE + 1 ,源碼詳見:org.minbox.framework.logging.client.notice.support.LoggingAdminNotice 。 |
Logging Client
內部經過ApplicationContext
從Spring IOC
內獲取指定LoggingNotice
類型的實例列表,正由於這樣也就支持了多日誌通知
的方式。
注意:日誌通知實現類的優先級值建議不要重複。
在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");
}
}
複製代碼
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='請求日誌信息表';
複製代碼
初始化Logging Admin
所須要的表結構以後,咱們在集成Logging Admin
的項目中添加數據源
、數據庫驅動
、持久化框架
等依賴,而後進行配置數據源相關數據庫參數,下面以SpringBoot項目示例。
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>
複製代碼
Logging Admin
並不固定依賴ApiBoot
提供的持久化框架,可使用任意框架依賴,Logging Admin
內部只是須要DataSource
的實例,也能夠自定義建立DataSource
對象放入Spring IOC
。
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
複製代碼
Logging Admin
做爲一個依賴添加到SpringBoot
項目內,咱們只須要考慮如何將SpringBoot
項目註冊到服務註冊中心
(SpringCloud Service Register Center),若是你使用的Eureka
做爲服務註冊中心,請訪問我以前編寫的文章查看將微服務提供者註冊到Eureka服務中心。
Logging Admin
的安全採用的是Spring Security
提供的Basic Auth
來完成。
在項目的pom.xml
內添加以下依賴:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
複製代碼
建議採用Spring Security
提供的內存方式
來配置Logging Admin
,application.yml
配置文件以下所示:
spring:
security:
user:
# 用戶名
name: user
# 密碼
password: 123
複製代碼
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());
// 自定義業務處理...
}
}
複製代碼
Logging Admin
因爲採用的是Spring
內部提供的SmartApplicationListener
方式來監聽ReportLogEvent
事件,因此只須要添加多個自定義監聽實現SmartApplicationListener
接口便可。
SmartApplicationListener
因爲實現了Ordered
接口,因此提供優先級配置方法getOrder
,與LoggingNotice
接口優先級策略一致,值越小優先級越高。
詳細瞭解Spring
提供的Event/Listener
能夠訪問SpringBoot使用ApplicationEvent&Listener完成業務解耦。
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;
}
複製代碼
ApiBoot
集成LoggingAdminFactoryBean
詳細源碼請訪問ApiBootLoggingAdminAutoConfiguration。
經過LoggingAdminFactoryBean#setDataSource
方法來設置Logging Admin
所須要操做日誌數據的數據源,以下所示:
// 設置數據源
factoryBean.setDataSource(dataSource);
複製代碼
經過LoggingAdminFactoryBean#setShowConsoleReportLog
方法來控制是否在控制檯打印Logging Client
上報的日誌信息,以下所示:
// 設置在控制檯輸出Logging Client 上報的日誌
factoryBean.setShowConsoleReportLog(true);
複製代碼
經過LoggingAdminFactoryBean#setFormatConsoleLogJson
方法來格式化控制檯輸出的日誌,以下所示:
// 格式化控制檯輸出的日誌
factoryBean.setFormatConsoleLogJson(true);
複製代碼
本文由博客一文多發平臺 OpenWrite 發佈!