介紹MinBox Logging內的概念及作用
I. 概念
在minbox-logging
日誌元件內設計了多個概念以及名詞定義,我們本篇文章來講解下每個概念的含義以及作用。
0. 原始碼 & 檔案
-
ApiBoot整合示例:ApiBoot Logging Configuration
1. Client
client
在整體架構體系中是客戶端
的概念,也就是我們的業務服務角色,在使用者發起一個請求時,可能會經過多個業務服務來完成一系列的業務操作或者查詢結果的組裝,而每個服務在minbox-logging
內就是client
的概念,client
採集
、上報
、快取
等。
1.1 日誌採集
client
目前版本支援採集spring-mvc
的web
應用程式請求日誌資訊(目前版本暫未支援web-flux
),通過攔截器
獲取每次請求的鏈路編號(traceId)
、單元編號(spanId)
、請求引數
、請求主體
、Header列表
、請求路徑
、請求耗時
等詳細資訊,根據採集到的日誌引數可以精準的定位到請求資訊。
1.2 日誌上報
client
目前支援兩種上報方式,分別是:just(直接上報)
、timing(定時延遲上報)
,當採集到日誌資訊後通過攔截LoggingWebInterceptor#afterCompletion
方法來進行非同步上報資訊,在這裡採用非同步上傳的方式,為了防止出現日誌上報網路延遲導致使用者發起的請求
1.3 日誌快取
client
端提供了短暫的記憶體方式快取
,當我們使用timing
方式進行上報日誌時,日誌臨時會儲存到memory(記憶體)
中,每次定時上報會從記憶體快取
中取到配置數量的請求日誌一併上報到admin
,一次上報的數量也有使用者自定義配置,預設為10
。
當client
正常停止時,通過實現DisposableBean
介面的destory
方法內會一併將記憶體快取
的請求日誌一併上報到admin
。
2. Admin
admin
在整體架構體系中擔任管理端
的角色,用於接收client
上報的請求日誌、儲存日誌
、日誌分析
等操作。
在
minbox-logging
體系中admin
並不是必須存在的,如果是單體應用程式,可單獨使用client
在本地進行採集、儲存、分析等。
2.1 日誌接收
admin
內部提供了一個上報日誌的端點,該端點是一個標準的REST
介面定義,可一次性接收一個client
上傳的多條請求日誌。
執行順序:
- 檢查
client
是否為第一次上報日誌,如果是則執行儲存伺服器基本資訊 - 執行儲存該
client
對應伺服器的請求日誌資訊到資料庫
2.2 日誌儲存
admin
內部提供了資料庫
方式的儲存實現類LoggingDataSourceStorage
,通過建立LoggingDataSourceStorage
的物件並且設定到LoggingAdminFactoryBean
內即可完成配置,在建立LoggingDataSourceStorage
物件時需要傳遞資料來源,內部是通過JDBC
直接操作SQL
來完成的資料操作,這樣不依賴任何第三方ORM
框架, 只需要DataSource
物件即可。
2.3 自定義儲存
目前版本admin
僅提供了一個資料來源方式儲存,如果我們需要自定義儲存可以通過實現LoggingStorage
介面,然後建立自定義的物件例項後設定到LoggingAdminFactoryBean
內即可。
2.4 日誌分析(規劃中)
在admin
端,我們拿到資料後可以針對某一些點進行分析,比如:請求耗時較多的介面、介面的呼叫頻率,針對呼叫頻率可以有效的擴充套件對應服務的節點數量來應對流量。
3. Cache
cache
用於臨時快取請求日誌
,盡在timing
上報方式下生效。
4. ReportScheduled
定時上報日誌,應用於timing
上報方式,內部是一個定時執行緒,間隔一段時間呼叫上報日誌
方法。
每次預設會上報10條請求日誌,每間隔5秒執行一次。
5. AdminDiscovery
AdminDiscovery
來client
用於發現admin
服務的介面定義,在client
內提供了兩種方式,分別是:LoggingAppointAdminDiscovery
、LoggingRegistryCenterAdminDiscovery
。
通過LoggingFactoryBean#setLoggingAdminDiscovery
方法進行設定。
5.1 LoggingAppointAdminDiscovery
指定admin
具體地址資訊的發現方式,通過建構函式可以指定多個admin
地址,而且每個admin
地址可以使用不同的basic
基礎認證資訊。
當指定多個admin
時,預設通過平滑輪詢策略負載均衡方式上報,可自定義指定隨機策略
負載均衡方式。
admin
地址的格式為:user:123456@localhost:9090
,@
前面為basic
認證資訊。
5.2 LoggingRegistryCenterAdminDiscovery
admin
支援從服務註冊中心(Eureka、Consul、Nacos Discovery、Zookeeper等)內讀取指定applicationId
的服務節點列表,通過ribbon
預設的負載均衡策略進行獲取可用admin
節點資訊。
如果是
SpringCloud
構建的專案,建議使用這種方式。
6. LoggingNotice
client
的日誌通知方法,預設該介面有兩個實現類,分別是:LoggingLocalNotice
、LoggingAdminNotice
,當一個請求完成時,client
會釋出一個LoggingNoticeEvent
事件,該事件的監聽者會獲取LoggingNotice
的全部實現類,根據getOrder
方法的值順序執行,值越大越靠前。
6.1 LoggingLocalNotice
client
的本地控制檯輸出日誌、控制檯格式化日誌的LoggingNotice
實現類,會第一個被執行。
6.2 LoggingAdminNotice
client
的上報日誌到admin
入口,會根據上報方式進行執行對應的業務邏輯。
-
timing(延遲上報)
會將本次的
MinBoxLog
物件快取到cache
,放入記憶體。 -
just(直接上報)
通過
LoggingFactoryBean
獲取LoggingAdminReport
實現類,呼叫report
方法進行上報日誌資訊到admin
。
7. ReportLogEvent
當client
將日誌上報到admin
後,admin
會通過ApplicationContext
釋出ReportLogEvent
事件,在admin
內提供了兩個該事件的監聽實現,分別是:ReportLogJsonFormatListener
、ReportLogStorageListener
。
7.1 ReportLogJsonFormatListener
用於格式化並在控制檯顯示client
上報的日誌資訊。
7.2 ReportLogStorageListener
獲取LoggingAdminFactoryBean
提供的LoggingStorage
介面實現類例項來進行持久化請求日誌。
7.3 自定義監聽
通過實現Spring
提供的SmartApplicationListener
監聽器介面來自定義日誌的儲存或者其他分析操作,具體實現詳見檔案。