在minbox-logging
日誌組件內設計了多個概念以及名詞定義,咱們本篇文章來說解下每一個概念的含義以及做用。java
client
在總體架構體系中是客戶端
的概念,也就是咱們的業務服務角色,在用戶發起一個請求時,可能會通過多個業務服務來完成一系列的業務操做或者查詢結果的組裝,而每一個服務在minbox-logging
內就是client
的概念,client
要完成的工做是日誌的採集
、上報
、緩存
等。git
client
目前版本支持採集spring-mvc
的web
應用程序請求日誌信息(目前版本暫未支持web-flux
),經過攔截器
獲取每次請求的鏈路編號(traceId)
、單元編號(spanId)
、請求參數
、請求主體
、Header列表
、請求路徑
、請求耗時
等詳細信息,根據採集到的日誌參數能夠精準的定位到請求信息。web
client
目前支持兩種上報方式,分別是:just(直接上報)
、timing(定時延遲上報)
,當採集到日誌信息後經過攔截LoggingWebInterceptor#afterCompletion
方法來進行異步上報信息,在這裏採用異步上傳的方式,爲了防止出現日誌上報網絡延遲致使用戶發起的請求
響應時間過長。spring
client
端提供了短暫的內存方式緩存
,當咱們使用timing
方式進行上報日誌時,日誌臨時會存儲到memory(內存)
中,每次定時上報會從內存緩存
中取到配置數量的請求日誌一併上報到admin
,一次上報的數量也有使用者自定義配置,默認爲10
。數據庫
當client
正常中止時,經過實現DisposableBean
接口的destory
方法內會一併將內存緩存
的請求日誌一併上報到admin
。api
admin
在總體架構體系中擔任管理端
的角色,用於接收client
上報的請求日誌、存儲日誌
、日誌分析
等操做。spring-mvc
在minbox-logging
體系中admin
並非必須存在的,若是是單體應用程序,可單獨使用client
在本地進行採集、存儲、分析等。
admin
內部提供了一個上報日誌的端點,該端點是一個標準的REST
接口定義,可一次性接收一個client
上傳的多條請求日誌。緩存
執行順序:服務器
client
是否爲第一次上報日誌,若是是則執行保存服務器基本信息client
對應服務器的請求日誌信息到數據庫admin
內部提供了數據庫
方式的存儲實現類LoggingDataSourceStorage
,經過建立LoggingDataSourceStorage
的對象而且設置到LoggingAdminFactoryBean
內便可完成配置,在建立LoggingDataSourceStorage
對象時須要傳遞數據源,內部是經過JDBC
直接操做SQL
來完成的數據操做,這樣不依賴任何第三方ORM
框架, 只須要DataSource
對象便可。網絡
目前版本admin
僅提供了一個數據源方式存儲,若是咱們須要自定義存儲能夠經過實現LoggingStorage
接口,而後建立自定義的對象實例後設置到LoggingAdminFactoryBean
內便可。
在admin
端,咱們拿到數據後能夠針對某一些點進行分析,好比:請求耗時較多的接口、接口的調用頻率,針對調用頻率能夠有效的擴展對應服務的節點數量來應對流量。
cache
用於臨時緩存請求日誌
,盡在timing
上報方式下生效。
定時上報日誌,應用於timing
上報方式,內部是一個定時線程,間隔一段時間調用上報日誌
方法。
每次默認會上報10條請求日誌,每間隔5秒執行一次。
AdminDiscovery
來client
用於發現admin
服務的接口定義,在client
內提供了兩種方式,分別是:LoggingAppointAdminDiscovery
、LoggingRegistryCenterAdminDiscovery
。
經過LoggingFactoryBean#setLoggingAdminDiscovery
方法進行設置。
指定admin
具體地址信息的發現方式,經過構造函數能夠指定多個admin
地址,並且每一個admin
地址可使用不一樣的basic
基礎認證信息。
當指定多個admin
時,默認經過平滑輪詢策略負載均衡方式上報,可自定義指定隨機策略
負載均衡方式。
admin
地址的格式爲:user:123456@localhost:9090
,@
前面爲basic
認證信息。
admin
支持從服務註冊中心(Eureka、Consul、Nacos Discovery、Zookeeper等)內讀取指定applicationId
的服務節點列表,經過ribbon
默認的負載均衡策略進行獲取可用admin
節點信息。
若是是
SpringCloud
構建的項目,建議使用這種方式。
client
的日誌通知方法,默認該接口有兩個實現類,分別是:LoggingLocalNotice
、LoggingAdminNotice
,當一個請求完成時,client
會發佈一個LoggingNoticeEvent
事件,該事件的監聽者會獲取LoggingNotice
的所有實現類,根據getOrder
方法的值順序執行,值越大越靠前。
client
的本地控制檯輸出日誌、控制檯格式化日誌的LoggingNotice
實現類,會第一個被執行。
client
的上報日誌到admin
入口,會根據上報方式進行執行對應的業務邏輯。
會將本次的MinBoxLog
對象緩存到cache
,放入內存。
經過LoggingFactoryBean
獲取LoggingAdminReport
實現類,調用report
方法進行上報日誌信息到admin
。
當client
將日誌上報到admin
後,admin
會經過ApplicationContext
發佈ReportLogEvent
事件,在admin
內提供了兩個該事件的監聽實現,分別是:ReportLogJsonFormatListener
、ReportLogStorageListener
。
用於格式化並在控制檯顯示client
上報的日誌信息。
獲取LoggingAdminFactoryBean
提供的LoggingStorage
接口實現類實例來進行持久化請求日誌。
經過實現Spring
提供的SmartApplicationListener
監聽器接口來自定義日誌的存儲或者其餘分析操做,具體實現詳見文檔。