日志系統(tǒng)的架構(gòu)設(shè)計方案
日志對于我們開發(fā)人員是非常重要的,當我們的系統(tǒng)會出現(xiàn)異?;蛘邩I(yè)務(wù)出現(xiàn)錯誤的時候,我們都是利用日志來定位問題,問題定位到之后就可以有針對性的來解決這個問題,下面我們來聊聊日志系統(tǒng)架構(gòu)的常見設(shè)計方案。
1、單體應(yīng)用下的日志系統(tǒng)設(shè)計
在互聯(lián)網(wǎng)初期的業(yè)務(wù)系統(tǒng)都是單體架構(gòu)部署的,所以針對這種架構(gòu)下的日志一般都是采用文件的形式存儲日志,如下所示:
用戶在使用系統(tǒng)的過程中,系統(tǒng)中采用log4j或者logback方案來記錄日志數(shù)據(jù)到日志文件中,如果項目中出現(xiàn)問題之后,開發(fā)人員可以直接從日志文件中定位系統(tǒng)的問題點。
這種單體方案下的日志架構(gòu)設(shè)計的優(yōu)勢是部署簡單、成本低、性能高,但是在當下微服務(wù)架構(gòu)中就不太適用了。
2、微服務(wù)架構(gòu)下的日志系統(tǒng)設(shè)計
隨著業(yè)務(wù)的發(fā)展,很多公司都是采用微服務(wù)架構(gòu)部署應(yīng)用,如下圖所示的微服務(wù)圖:
如果微服務(wù)架構(gòu)下我們依然采用文件的形式來保存日志的話,一旦系統(tǒng)出現(xiàn)問題就非常的難定位問題,所以在微服務(wù)架構(gòu)下我們需要一個統(tǒng)一的日志管理系統(tǒng)來幫助我們存儲日志和提供頁面查詢?nèi)罩竟δ堋?span>
在微服務(wù)架構(gòu)下需要設(shè)計一套不僅可以收集日志,而且還提供日志查詢功能的日志管理系統(tǒng),但是這個日志系統(tǒng)一方面不能影響我們正常的業(yè)務(wù)執(zhí)行,另一方面還需要具有可擴展性,用于方便后續(xù)的其他系統(tǒng)日志接入。目前比較主流的日志架構(gòu)設(shè)計方案有如下幾種:
(1)ELK日志架構(gòu)方案
圖片
ELK方式的是目前比較主流的方案,這種方案的一個比較全面、功能比較齊全的日志系統(tǒng)實現(xiàn)方案,實現(xiàn)的原理是通過filebeat采集日志信息并推送到MQ上,MQ將日志信息讓logstash消費,logstash通過日志的過濾和轉(zhuǎn)化之后將日志存儲到ES中,開發(fā)人員通過Kibana查詢ES中的日志數(shù)據(jù)。
(2)采用mongodb實現(xiàn)日志系統(tǒng)的方案
圖片
此方案的原理是各個服務(wù)中的日志采集后通過異步消息的方式存儲到mongodb中,由于mongodb是一個nosql的數(shù)據(jù)庫,它通過json的方式存儲日志數(shù)據(jù)并且支持非常豐富的查詢語句,可以幫助我們對日志的數(shù)據(jù)來進行過濾查詢,最后開發(fā)人員通過web頁面就可以實現(xiàn)對日志的查詢功能。
由于mongodb是存儲json數(shù)據(jù)格式,所以它可以存儲非常靈活的日志數(shù)據(jù)結(jié)構(gòu),并且它也支持分片和復制等功能,mongodb適合大規(guī)模的日志數(shù)據(jù)存儲、復雜的查詢場景下的日志系統(tǒng)實現(xiàn)方案。
(3)Loki日志系統(tǒng)實現(xiàn)方案
Loki是grafana提供的一個插件,它類似es一樣存儲了日志信息,通過promtail收集日志數(shù)據(jù),然后將日志的數(shù)據(jù)推送到Loki中存儲,最后開發(fā)人員通過grafana查詢?nèi)罩緮?shù)據(jù)。
這種方案比較適用于應(yīng)用系統(tǒng)有部署granfan并且公司只需要一個輕量級的日志收集系統(tǒng)前提下使用。
總結(jié):
市面上比較成熟的方案有ELK、mongodb方案、Loki方案,每種方案都有各自的特點,在搭建日志系統(tǒng)的時候我們可以根據(jù)實際的業(yè)務(wù)需要選擇合適的方案。