1. 程式人生 > 程式設計 >介紹MinBox Logging內的概念及作用

介紹MinBox Logging內的概念及作用

I. 概念

minbox-logging日誌元件內設計了多個概念以及名詞定義,我們本篇文章來講解下每個概念的含義以及作用

0. 原始碼 & 檔案

1. Client

client在整體架構體系中是客戶端的概念,也就是我們的業務服務角色,在使用者發起一個請求時,可能會經過多個業務服務來完成一系列的業務操作或者查詢結果的組裝,而每個服務在minbox-logging內就是client的概念,client

要完成的工作是日誌的採集上報快取等。

1.1 日誌採集

client目前版本支援採集spring-mvcweb應用程式請求日誌資訊(目前版本暫未支援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上傳的多條請求日誌。

執行順序:

  1. 檢查client是否為第一次上報日誌,如果是則執行儲存伺服器基本資訊
  2. 執行儲存該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

AdminDiscoveryclient用於發現admin服務的介面定義,在client內提供了兩種方式,分別是:LoggingAppointAdminDiscoveryLoggingRegistryCenterAdminDiscovery

通過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的日誌通知方法,預設該介面有兩個實現類,分別是:LoggingLocalNoticeLoggingAdminNotice,當一個請求完成時,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內提供了兩個該事件的監聽實現,分別是:ReportLogJsonFormatListenerReportLogStorageListener

7.1 ReportLogJsonFormatListener

用於格式化並在控制檯顯示client上報的日誌資訊。

7.2 ReportLogStorageListener

獲取LoggingAdminFactoryBean提供的LoggingStorage介面實現類例項來進行持久化請求日誌。

7.3 自定義監聽

通過實現Spring提供的SmartApplicationListener監聽器介面來自定義日誌的儲存或者其他分析操作,具體實現詳見檔案。