引言
日志對(duì)于程序非常重要,日志對(duì)于定位問題乞巧,數(shù)據(jù)分析有著十分強(qiáng)大的作用摊鸡,是程序員和運(yùn)維人員重要的工具丢烘。線上90%以上Bug都是依靠程序日志輸出定位到播瞳。
日志存儲(chǔ)選擇
日志數(shù)據(jù)是一種時(shí)序數(shù)據(jù)赢乓,是一種記錄當(dāng)前時(shí)刻的狀態(tài)的數(shù)據(jù)石窑,只是做數(shù)據(jù)的追加,不做修改躺屁,定期刪除经宏,日志數(shù)據(jù)互相之間沒有直接依賴關(guān)系,同時(shí)數(shù)據(jù)量巨大耐亏,根據(jù)這些特點(diǎn)logs要能被快速低成本存儲(chǔ)沪斟,快速查詢分析。
如果采用關(guān)系型數(shù)據(jù)庫存儲(chǔ)查詢择吊,成本會(huì)非常高槽奕,并且關(guān)系數(shù)據(jù)庫對(duì)于巨額數(shù)據(jù)查詢分析顯得不那么給力,所以如果沒有非常特殊的要求枉长,不會(huì)選擇用關(guān)系型數(shù)據(jù)庫琼讽。
目前市面上的時(shí)序數(shù)據(jù)庫對(duì)文本類型的數(shù)據(jù)處理不夠給力,雖然在存儲(chǔ)成本和效率方面有優(yōu)勢(shì)吼蚁,但是對(duì)于查詢尤其對(duì)文本類數(shù)據(jù)進(jìn)行aggregation數(shù)據(jù)分析顯得乏力。
ES作為一種文檔數(shù)據(jù)庫粒蜈,提供高效低成本存儲(chǔ)能力和對(duì)于巨量數(shù)據(jù)的分析查詢的優(yōu)秀能力枯怖,當(dāng)仁不讓的成為日志存存儲(chǔ)的優(yōu)秀選擇能曾。
日志收集工具選擇
Logstatsh提供了logs對(duì)es的接口功能,將logs轉(zhuǎn)換成結(jié)構(gòu)數(shù)據(jù)存儲(chǔ)到es中蕊程,提供日志收集驼唱,日志轉(zhuǎn)換,數(shù)據(jù)緩存等功能辨赐。Logstatsh是用jruby 和java開發(fā)的需要預(yù)先安裝jdk纽窟,同時(shí)本身的性能一值受詬病兼吓,放在客戶端做為日志收集傳輸工具顯得太笨重了,于是就出現(xiàn)了Logstash-Forwarder這個(gè)項(xiàng)目(Filebeat的前身)审孽,采用golang編寫浑娜,高效輕量級(jí)同時(shí)也易于擴(kuò)展。
Filebeat開始的設(shè)計(jì)目的是作為data shippers完成采集傳輸功能打颤,es 5.x 把 Ingest Node processor 集成到了es本身漓滔,filebeat就可以借助ES完成原先需要logstatsh完成的數(shù)據(jù)轉(zhuǎn)換功能,獨(dú)立完成和ES對(duì)接透且。
Filebeat 重要概念
Registry文件
Filebeat會(huì)將自己處理日志文件的進(jìn)度信息寫入到registry文件中秽誊,以保證filebeat在重啟之后能夠接著處理未處理過的數(shù)據(jù),而無需從頭開始锅论。
Ingest node pipeline
elastic-search 5.x之后引入一個(gè)名為ingest node的功能(將Logstatsh
的預(yù)處理相關(guān)功能遷移到了Elasticsearch核心功能中)來通過預(yù)定義pipeline實(shí)現(xiàn)文檔預(yù)處理,功能類似于函數(shù)式編程中的each對(duì)每一個(gè)es doc進(jìn)行統(tǒng)一的處理肾胯。
pipeline 是由一個(gè)預(yù)定義的有序的processors構(gòu)成耘纱,這些processors包括gsub,grok艳馒,轉(zhuǎn)換员寇,刪除,重命名等功能陆爽,并且還有ingest attachment扳缕、ingest geo-ip、ingest user-agent等強(qiáng)大的插件功能驴剔,利用pipeline可以方便的完成logs 數(shù)據(jù)的解析(利用grok文本文件到結(jié)構(gòu)化的json格式)粥庄、轉(zhuǎn)換、過濾等布讹。
filebeat基本執(zhí)行流程和模式:
1.input: 在配置路徑(或者路徑globs)中找到要獲取的文件训堆,并啟動(dòng)harvester。
2.harvester:讀取文件挠乳,向spooler發(fā)送事件
3.spooler: 緩沖events(將日志行封裝成event),適時(shí)的flush events 數(shù)據(jù)到publisher盟蚣。
4.publisher: 將數(shù)據(jù)寫入網(wǎng)絡(luò)接口進(jìn)行發(fā)送屎开,同時(shí)通知registrar。
5.registrar: 通過registrar文件記錄log文件讀取位置奄抽。
當(dāng)重啟時(shí)甩鳄,input 通過registrar文件,獲取上次讀取的文件的位置档泽,重啟harvester繼續(xù)完成相關(guān)流程.
Filebeat 配置使用
Filebeat內(nèi)置預(yù)定義modules揖赴,如需對(duì)Apache mysql 日志監(jiān)控可以直接插拔使用,同時(shí)Filebeat提供方便的內(nèi)置工具來自定義modules燥滑。
在Filebeat discovery 自動(dòng)發(fā)現(xiàn)機(jī)制,可以利用服務(wù)發(fā)現(xiàn)等相關(guān)機(jī)制方便獲取docker k8s logs赃蛛。
Filebeat支持多種input(log數(shù)據(jù)來源) Log(日志文件)羽历、Stdin淡喜、Container、Kafka澎嚣、Redis瘟芝、UDP、Docker晤郑、TCP、Syslog 等造寝,同時(shí)支持多種output如Kafka Redis ES logstatsh等。
簡(jiǎn)單情況配置的output到es析显,如果追求高可用性签赃,可以用 Filebeat -> Kafka(Redis) -> logstatsh 的模型。
Logs 格式化技巧
logs要最終序列化到ES歹嘹,為了方便es的分析查詢需要進(jìn)行數(shù)據(jù)格式化孔庭,格式化有兩種方式,一種是采用白盒方式直接在程序開發(fā)中將logs直接定義成json格式尖昏,適合程序開發(fā)階段定義使用构资,優(yōu)點(diǎn)是可控簡(jiǎn)單不需要配置復(fù)雜的glob,可以避免一些數(shù)據(jù)編碼和解碼錯(cuò)誤迹淌,缺點(diǎn)是對(duì)程序有一定的侵入性。
另一種采用glob piplie 方式通過配置解析規(guī)則來解析固定格式的logs data唉窃, 適合采集第三方軟件服務(wù)(redis db 等)日志纹份,優(yōu)缺點(diǎn)和第一種相反廷痘。