溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

基于可視化配置的日志結(jié)構(gòu)化轉(zhuǎn)換實(shí)現(xiàn)

發(fā)布時(shí)間:2020-06-18 02:02:04 來源:網(wǎng)絡(luò) 閱讀:3673 作者:宜信技術(shù) 欄目:大數(shù)據(jù)

導(dǎo)讀:數(shù)據(jù)總線DBus的總體架構(gòu)中主要包括六大模塊,分別是:日志抓取模塊、增量轉(zhuǎn)換模塊、全量抽取程序、日志算子處理模塊、心跳監(jiān)控模塊、Web管理模塊。六大模塊各自的功能相互連接,構(gòu)成DBus的工作原理:通過讀取RDBMS增量日志的方式來實(shí)時(shí)獲取增量數(shù)據(jù)日志(支持全量拉?。?;基于Logstash,flume,filebeat等抓取工具來實(shí)時(shí)獲得數(shù)據(jù),以可視化的方式對數(shù)據(jù)進(jìn)行結(jié)構(gòu)化輸出。本文主要介紹的是DBus中基于可視化配置的日志結(jié)構(gòu)化轉(zhuǎn)換實(shí)現(xiàn)的部分。

一、結(jié)構(gòu)化日志的原理

1.1 源端日志抓取

DBus可以對接多種log數(shù)據(jù)源,例如:Logstash、Flume、Filebeat等。上述組件都是業(yè)界比較流行的日志抓取工具,一方面便于用戶和業(yè)界統(tǒng)一標(biāo)準(zhǔn),方便用戶技術(shù)方案的整合;另一方面也避免了無謂的重復(fù)造輪子。抓取的數(shù)據(jù)我們稱為原始數(shù)據(jù)日志(raw data log),由抓取組件將其寫入Kafka中,等待DBus后續(xù)處理。

1.2 可視化配置規(guī)則,使日志結(jié)構(gòu)化

用戶可自定義配置日志源和目標(biāo)端。同一個(gè)日志源的數(shù)據(jù)可以輸出到多個(gè)目標(biāo)端。每一條“日志源-目標(biāo)端”線,用戶可以根據(jù)自己的需要來配置相應(yīng)的過濾規(guī)則。經(jīng)過規(guī)則算子處理后的日志是結(jié)構(gòu)化的,即:有schema約束,類似于數(shù)據(jù)庫中的表。

1.3 規(guī)則算子

DBus設(shè)計(jì)了豐富易用的算子,用于對數(shù)據(jù)進(jìn)行定制化操作。用戶對數(shù)據(jù)的處理可分為多個(gè)步驟進(jìn)行,每個(gè)步驟的數(shù)據(jù)處理結(jié)果可即時(shí)查看、驗(yàn)證;并且可重復(fù)使用不同算子,直到轉(zhuǎn)換、裁剪出自己需要的數(shù)據(jù)。

1.4 執(zhí)行引擎

將配置好的規(guī)則算子組應(yīng)用到執(zhí)行引擎中,對目標(biāo)日志數(shù)據(jù)進(jìn)行預(yù)處理,形成結(jié)構(gòu)化數(shù)據(jù),輸出到Kafka,供下游數(shù)據(jù)使用方使用。系統(tǒng)流程圖如下所示:

基于可視化配置的日志結(jié)構(gòu)化轉(zhuǎn)換實(shí)現(xiàn)

根據(jù)DBus log設(shè)計(jì)原則,同一條原始日志,可以被提取到一個(gè)或多個(gè)表中。每個(gè)表是結(jié)構(gòu)化的,滿足相同的schema約束。

  • 每個(gè)表是一個(gè)規(guī)則算子組的集合,每個(gè)表可以擁有1個(gè)或多個(gè)規(guī)則算子組;
  • 每個(gè)規(guī)則算子組,由一組規(guī)則算子組合而成,每個(gè)算子具有獨(dú)立性;

對于任意一條原始數(shù)據(jù)日志(raw data log),它應(yīng)該屬于哪張表呢?

假如用戶定義了若干張邏輯表(T1,T2…),用于抽取不同類型的日志,那么,每條日志需要與規(guī)則算子組進(jìn)行匹配:

  • 進(jìn)入某張表T1的所有規(guī)則算子組的執(zhí)行過程
  • 符合條件的進(jìn)入規(guī)則算子組,并且被執(zhí)行引擎轉(zhuǎn)換為結(jié)構(gòu)化的表數(shù)據(jù)
  • 不符合提取條件的日志嘗試下一個(gè)規(guī)則算子組
  • 對于T1的所有規(guī)則算子組,如果都不滿足要求,則進(jìn)入下一張表T2的執(zhí)行過程,以此類推
  • 如果該條日志不符合任何一張表的過濾規(guī)則,則進(jìn)入_unknown_table_表

基于可視化配置的日志結(jié)構(gòu)化轉(zhuǎn)換實(shí)現(xiàn)

例如,對于同一條應(yīng)用日志,其可能屬于不止一個(gè)規(guī)則組或Table,而在我們定義的規(guī)則組或Table中,只要其滿足過濾條件,該應(yīng)用日志就可以被規(guī)則組提取,即保證了同一條應(yīng)用日志可以同屬于不同的規(guī)則組或Table。

基于可視化配置的日志結(jié)構(gòu)化轉(zhuǎn)換實(shí)現(xiàn)

規(guī)則算子是對數(shù)據(jù)進(jìn)行過濾、加工、轉(zhuǎn)換的基本單元。常見的規(guī)則算子如上圖所示。

算子之間具有獨(dú)立性,算子之間可以任意組合使用,從而可以實(shí)現(xiàn)許多復(fù)雜的、高級的功能,通過對算子進(jìn)行迭代使用,最終可以實(shí)現(xiàn)對任意數(shù)據(jù)進(jìn)行加工的目的。用戶可以開發(fā)自定義算子,算子的開發(fā)非常容易,用戶只要遵循基本接口原則,就可以開發(fā)任意的算子。

二、DBus日志處理實(shí)例

以DBus集群環(huán)境為例,DBus集群中有兩臺機(jī)器(即master-slave)部署了心跳程序,用于監(jiān)控、統(tǒng)計(jì)、預(yù)警等,心跳程序會產(chǎn)生一些應(yīng)用日志,這些應(yīng)用日志中包含各類事件信息,假如我們想要對這些日志進(jìn)行分類處理并結(jié)構(gòu)化到數(shù)據(jù)庫中,我們就可以采用DBus log程序?qū)θ罩具M(jìn)行處理。

DBus可以接入多種數(shù)據(jù)源(Logstash、Flume、Filebeat等),此處以Logstash為例來說明如何接入DBus的監(jiān)控和報(bào)警日志數(shù)據(jù)。

基于可視化配置的日志結(jié)構(gòu)化轉(zhuǎn)換實(shí)現(xiàn)

由于在dbus-n2和dbus-n3兩臺機(jī)器上分別存在監(jiān)控和預(yù)警日志,為此我們分別在兩臺機(jī)器上部署了Logstash程序。心跳數(shù)據(jù)由Logstash自帶的心跳插件產(chǎn)生,其作用是便于DBus對數(shù)據(jù)進(jìn)行統(tǒng)計(jì)和輸出,以及對源端日志抽取端(此處為Logstash)進(jìn)行預(yù)警(對于Flume和Filebeat來說,因?yàn)樗鼈儧]有心跳插件,所以需要額外為其定時(shí)產(chǎn)生心跳數(shù)據(jù))。Logstash程序?qū)懭氲終afka中的數(shù)據(jù)中既有普通格式的數(shù)據(jù),同時(shí)也有心跳數(shù)據(jù)。

這里不只是局限于2臺部署有Logstash程序的機(jī)器,DBus對Logstash數(shù)量不做限制,比如應(yīng)用日志分布在幾十上百臺機(jī)器上,只需要在每臺機(jī)器上部署Logstash程序,并將數(shù)據(jù)統(tǒng)一抽取到同一個(gè)Kafka Topic中,DBus就能夠?qū)λ兄鳈C(jī)的數(shù)據(jù)進(jìn)行數(shù)據(jù)處理、監(jiān)控、預(yù)警、統(tǒng)計(jì)等。

2.1 啟動Logstash

在啟動Logstash程序后,我們就可以從topic : heartbeat_log_logstash中讀取數(shù)據(jù),數(shù)據(jù)樣例如下:

1)心跳數(shù)據(jù)

基于可視化配置的日志結(jié)構(gòu)化轉(zhuǎn)換實(shí)現(xiàn)

2)普通日志數(shù)據(jù)

基于可視化配置的日志結(jié)構(gòu)化轉(zhuǎn)換實(shí)現(xiàn)

2.2 配置規(guī)則

接下來,我們只需要在DBus Web中配置相應(yīng)的規(guī)則就可以對數(shù)據(jù)進(jìn)行處理了。

首先新建一個(gè)邏輯表sink_info_table,該表用來抽取sink事件的日志信息,然后配置該表的規(guī)則組(一個(gè)或多個(gè),但所有的規(guī)則組過濾后的數(shù)據(jù)需要滿足相同schema特性),heartbeat_log_logstash作為原始數(shù)據(jù)topic,我們可以實(shí)時(shí)的對數(shù)據(jù)進(jìn)行可視化操作配置(所見即所得,即席驗(yàn)證)。

基于可視化配置的日志結(jié)構(gòu)化轉(zhuǎn)換實(shí)現(xiàn)

1)讀取原始數(shù)據(jù)日志

基于可視化配置的日志結(jié)構(gòu)化轉(zhuǎn)換實(shí)現(xiàn)

可以看到由Logstash預(yù)先提取已經(jīng)包含了log4j的基本信息,例如path、@timestamp、level等。但是數(shù)據(jù)日志的詳細(xì)信息在字段log中。由于不同的數(shù)據(jù)日志輸出是不一樣的,因此可以看到log列數(shù)據(jù)是不同的。

2)提取感興趣的列

假如我們對timestamp、log 等原始信息感興趣,那么可以添加一個(gè)toIndex算子,來提取這些字段:

基于可視化配置的日志結(jié)構(gòu)化轉(zhuǎn)換實(shí)現(xiàn)

這里需要指出,我們考慮使用數(shù)組下標(biāo)方式,是有原因的:

  • 并不是所有列本身自帶列名(例如flume抽取的原始數(shù)據(jù),或者split算子處理后的數(shù)據(jù)列);
  • 下標(biāo)方式可以使用數(shù)組方式指定列(類似python方式, 例如:1:3表示1,2列);
    因此后續(xù)操作全部基于數(shù)組下標(biāo)方式訪問。

執(zhí)行規(guī)則,就可以看到被提取后的字段情況:

基于可視化配置的日志結(jié)構(gòu)化轉(zhuǎn)換實(shí)現(xiàn)

3)過濾需要的數(shù)據(jù)

在這個(gè)例子中,我們只對含有“Sink to influxdb OK!”的數(shù)據(jù)感興趣。因此添加一個(gè)filter算子,提取第7列中包含”Sink to influxdb OK!”內(nèi)容的行數(shù)據(jù):

基于可視化配置的日志結(jié)構(gòu)化轉(zhuǎn)換實(shí)現(xiàn)

執(zhí)行后,只有符合條件的日志行數(shù)據(jù)才會存在。

基于可視化配置的日志結(jié)構(gòu)化轉(zhuǎn)換實(shí)現(xiàn)

4)對特定列進(jìn)行提取

添加一個(gè)select算子,我們對第1和3列的內(nèi)容感興趣,所以對這兩列進(jìn)行提取。

基于可視化配置的日志結(jié)構(gòu)化轉(zhuǎn)換實(shí)現(xiàn)

執(zhí)行select算子,數(shù)據(jù)中就會只含有第1和3列了。

基于可視化配置的日志結(jié)構(gòu)化轉(zhuǎn)換實(shí)現(xiàn)

5)以正則表達(dá)式的方式處理數(shù)據(jù)

我們想從第1列的數(shù)據(jù)中提取符合特定正則表達(dá)式的值,使用regexExtract算子對數(shù)據(jù)進(jìn)行過濾。正則表達(dá)式如下:http_code=(\d*).*type=(.*),ds=(.*),schema=(.*),table=(.*)\s.*errorCount=(\d*),用戶可以寫自定義的正則表達(dá)式。

基于可視化配置的日志結(jié)構(gòu)化轉(zhuǎn)換實(shí)現(xiàn)

執(zhí)行后,就會獲取正則表達(dá)式執(zhí)行后的數(shù)據(jù)。

基于可視化配置的日志結(jié)構(gòu)化轉(zhuǎn)換實(shí)現(xiàn)

6)選擇輸出列

最后我們把感興趣的列進(jìn)行輸出,使用saveAs算子, 指定列名和類型,方便于保存在關(guān)系型數(shù)據(jù)庫中。

基于可視化配置的日志結(jié)構(gòu)化轉(zhuǎn)換實(shí)現(xiàn)

執(zhí)行saveAs算子后,這就是處理好的最終輸出數(shù)據(jù)樣本。

基于可視化配置的日志結(jié)構(gòu)化轉(zhuǎn)換實(shí)現(xiàn)

2.3 查看結(jié)構(gòu)化輸出結(jié)果

保存上一步配置好的規(guī)則組,日志數(shù)據(jù)經(jīng)過DBus執(zhí)行算子引擎,就可以生成相應(yīng)的結(jié)構(gòu)化數(shù)據(jù)了。目前根據(jù)項(xiàng)目實(shí)際,DBus輸出的數(shù)據(jù)是UMS格式,如果不想使用UMS,可以經(jīng)過簡單的開發(fā),實(shí)現(xiàn)定制化。

注:UMS是DBus定義并使用的、通用的數(shù)據(jù)交換格式,是標(biāo)準(zhǔn)的JSON。其中同時(shí)包含了schema和數(shù)據(jù)信息。更多UMS介紹請參考DBus開源項(xiàng)目主頁的介紹。開源地址:https://github.com/bridata/dbus

以下是測試案例,輸出的結(jié)構(gòu)化UMS數(shù)據(jù)的樣例:

基于可視化配置的日志結(jié)構(gòu)化轉(zhuǎn)換實(shí)現(xiàn)

2.4 日志監(jiān)控

為了便于掌握數(shù)據(jù)抽取、規(guī)則匹配、監(jiān)控預(yù)警等情況,我們提供了日志數(shù)據(jù)抽取的可視化實(shí)時(shí)監(jiān)控界面,如下圖所示,可隨時(shí)了解以下信息:

  • 實(shí)時(shí)數(shù)據(jù)條數(shù)
  • 錯(cuò)誤條數(shù)情況(錯(cuò)誤條數(shù)是指:執(zhí)行算子時(shí)出現(xiàn)錯(cuò)誤的情況,幫助發(fā)現(xiàn)算子與數(shù)據(jù)是否匹配,用于修改算子,DBus同時(shí)也提供了日志回讀的功能,以免丟失部分?jǐn)?shù)據(jù))
  • 數(shù)據(jù)延時(shí)情況
  • 日志抽取端是否正常

基于可視化配置的日志結(jié)構(gòu)化轉(zhuǎn)換實(shí)現(xiàn)

監(jiān)控信息中包含了來自集群內(nèi)各臺主機(jī)的監(jiān)控信息,以主機(jī)IP(或域名)對數(shù)據(jù)分別進(jìn)行監(jiān)控、統(tǒng)計(jì)和預(yù)警等。

監(jiān)控中還有一張表叫做_unkown_table_ 表明所有沒有被匹配上的數(shù)據(jù)條數(shù)。例如:Logstash抓取的日志中有5種不同事件的日志數(shù)據(jù),我們只捕獲了其中3種事件,其它沒有被匹配上的數(shù)據(jù),全部在_unkown_table_計(jì)數(shù)中。

基于可視化配置的日志結(jié)構(gòu)化轉(zhuǎn)換實(shí)現(xiàn)

DBus同樣可以接入Flume、Filebeat、UMS等數(shù)據(jù)源,只需要稍作配置,就可以實(shí)現(xiàn)類似于對Logstash數(shù)據(jù)源同樣的處理效果,更多關(guān)于DBus對log的處理說明,請參考:

  • https://bridata.github.io/DBus/install-logstash-source.html

  • https://bridata.github.io/DBus/install-flume-source.html

  • https://bridata.github.io/DBus/install-filebeat-source.html

應(yīng)用日志經(jīng)過DBus處理后,將原始數(shù)據(jù)日志轉(zhuǎn)換為了結(jié)構(gòu)化數(shù)據(jù),輸出到Kafka中提供給下游數(shù)據(jù)使用方進(jìn)行使用,比如通過Wormhole將數(shù)據(jù)落入數(shù)據(jù)庫等。具體如何將DBus與Wormhole結(jié)合起來使用,請參考:如何設(shè)計(jì)實(shí)時(shí)數(shù)據(jù)平臺(技術(shù)篇)。

作者:仲振林

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI