使用Elasticsearch+filebeat+logstach+kibana构建日志服务平台
背景
- devops中日志服務(wù)的搭建
- 收集各個(gè)節(jié)點(diǎn)(agent)的日志文件進(jìn)ES集群,并提供分析和查詢(xún)的服務(wù)
- 各個(gè)agent的filebeat收集服務(wù)不能終斷,也就是需要?jiǎng)討B(tài)reload配置文件
- 支持用戶(hù)設(shè)置分隔符劃分和正則匹配兩種方式添加field字段
技術(shù)方案
- 將filebeat部署在agent節(jié)點(diǎn),master節(jié)點(diǎn)控制agent節(jié)點(diǎn)的配置文件,filebeat很輕量
- 因?yàn)閒ilebeat的配置文件支持reload的只有input和moudel兩個(gè)模塊,但是需要對(duì)用戶(hù)提供的分隔符和正則表達(dá)式進(jìn)行處理,可以完成這個(gè)操作的processors模塊不支持動(dòng)態(tài)reload,所以filebeat只收集日志,處理日志的任務(wù)交給logstach,logstach支持整個(gè)配置文件的動(dòng)態(tài)reload
Filebeat安裝以及使用
-
Filebeat是一個(gè)輕量化的日志收集工具,對(duì)標(biāo)Logstach,filebeat只有30M,而logstach有300M
-
調(diào)試啟動(dòng)命令:./filebeat -e -c filebeat.yml,-c指明配置文件路徑,-e表示記錄到stderr,并禁用syslog文件輸出
-
啟動(dòng)命令相關(guān):https://johng.cn/filebeat-command-configuration/
-
后臺(tái)啟動(dòng)方式:nohup ./filebeat -e -c filebeat.yml > filebeat.log &
-
filebeat啟動(dòng)可以使用root用戶(hù),但是ES啟動(dòng)不能使用root用戶(hù)
-
reload相關(guān)寫(xiě)法參考:https://blog.csdn.net/junxuezheng/article/details/108349689
-
filebeat.yml配置文件
filebeat.config.inputs:enable: truepath: /usr/local/xxx/input.ymlreload.enable: truereload.period: 5soutput.console:pretty: true#output.elasticsearch: # hosts: ["10.243.65.186:9200"]output.logstash:hosts: ["1.1.1.186:5044"] processors: - rename:fields:- from: hostto: _host- from: messageto: _messageignore_missing: falsefail_on_error: true - drop_fields:fields:- ecs- log- input -
input.yml文件
- type: log# Change to true to enable this input configuration.enabled: true# Paths that should be crawled and fetched. Glob based paths.paths:- /usr/local/xxxtags: c7f1771f-0c8f-4c75-9d71-3b8c4b6bd191fields: source: wang_testfields_under_root: true -
filebeat只能輸出到一個(gè)地方,logstach可以輸出到多個(gè)地方
-
fields_under_root,這個(gè)字段如果設(shè)置為true,則新增的字段成為頂級(jí)目錄,和message平級(jí),如果為false,則會(huì)多出一個(gè)fields字段,這個(gè)fields字段和message字段平級(jí),我們自定義的字段都存放在fields字段下
-
注意,filebeat文件夾下有一個(gè)data的文件夾,可以記錄哪些行傳輸過(guò),所以如果ctrl+c之后再重開(kāi),不會(huì)把之前傳過(guò)的內(nèi)容再傳一遍,除非刪除這個(gè)data文件夾
Logstach安裝以及使用
-
二進(jìn)制安裝,解壓即用
-
可以用root用戶(hù)啟動(dòng)
-
部署命令:`bin/logstash -f config/xxx.conf
-
測(cè)試config文件是否寫(xiě)的正確bin/logstash -t -f config/xxx.conf
-
配置logstash自動(dòng)刷新配置文件:bin/logstash -f config/xxx.conf --config.reload.automatic
-
配置文件如下:
input {beats {port => 5044} }filter {mutate{rename => {"host" => "_host"}rename => {"message" => "_message"}rename => {"tags" => "_tags"}remove_field => ["@version", "ecs"]}if [log][file][path] == "/usr/local/dashuaibi/log/wang.log"{dissect {mapping => {"message" => "%{wang_time} %{wang_pid} %{wang_level} %{comtent}"}}} }output {if [log][file][path] == "/usr/local/dashuaibi/log/wang.log"{elasticsearch {hosts => "10.1.1.186:9200"index => "wang_test_666"}} }- 注意:mapping里的分隔符表達(dá)式,最后一個(gè)字段默認(rèn)會(huì)把后面所有的內(nèi)容都接收下來(lái)
- field字段的增刪改在filebeat和logstash中都可以做,看業(yè)務(wù)需求。
Elasticsearch安裝以及使用
-
二進(jìn)制安裝,解壓即用tar -zxf xxx.tar.gz
-
先在root用戶(hù)下修改權(quán)限chown -R elastic:elastic elastic
- 最后一個(gè)elastic是文件夾的名字
- -R表示處理指定目錄以及其子目錄下的所有文件
-
vim config/elasticsearch.yml,將network.host: 0.0.0.0,讓外部可以訪問(wèn)到
-
node.name: node-1這行的注釋也打開(kāi),下面這個(gè)操作要用
-
vim config/elasticsearch.yml,將cluster.initial_master_nodes: ["node-1"]這行的注釋打開(kāi),有幾個(gè)節(jié)點(diǎn)就在list里寫(xiě)幾個(gè)值,否則master節(jié)點(diǎn)會(huì)一直搜索另一個(gè)節(jié)點(diǎn),"node-1"是本臺(tái)機(jī)器的hostname,需要提前在/etc/hosts里定義(如果默認(rèn)沒(méi)有添加的話),文件里寫(xiě)的是ip + hostname
-
啟動(dòng)命令:bin/elasticsearch
-
ES不能使用root用戶(hù)啟動(dòng)
-
可以在創(chuàng)建ES索引的時(shí)候指定分片的參數(shù),wangtest是要?jiǎng)?chuàng)建的索引名
PUT wangtest {"settings": {"index": {"number_of_shards": 3,"number_of_replicas": 1}} }
Kibana安裝以及使用
- 二進(jìn)制安裝,解壓即用
- vim config/kibana.yml,將server.host:"0.0.0.0",讓外部可以訪問(wèn)到
- 啟動(dòng)命令:./bin/kibana,注意這個(gè).必須帶
- Kibana也不能使用root用戶(hù)啟動(dòng),但是根據(jù)提示,好像有開(kāi)關(guān)可以控制使用root啟動(dòng)
監(jiān)控軟件cerebro的安裝和使用
-
下載壓縮包,解壓
-
bin/cerebro
-
非必須:如果經(jīng)常使用的話,可以先在conf/application.conf中配置好ElasticSearch服務(wù)器地址
hosts = [{host = "http://localhost:9200"name = "Some Cluster"} ] -
參考:https://www.jianshu.com/p/433d821f9667
如何在腳本里啟動(dòng)filebeat
-
前提背景:有一些場(chǎng)景是需要在腳本里自動(dòng)啟動(dòng)的 ,且希望在后臺(tái)運(yùn)行,所以我想到了nohup
nohup ./filebeat -e -c /usr/local/sahoc/filebeat.yml &
這個(gè)做法可以后臺(tái)起一個(gè)進(jìn)程運(yùn)行filebeat,但是主進(jìn)程不會(huì)退出,因?yàn)閱?dòng)的filebeat在另一個(gè)進(jìn)程里有終端輸出
-
解決方案:nohup ./filebeat -e -c /usr/local/sahoc/filebeat.yml >> $FILEBEAT_LOG 2>&1 &
這樣把終端的輸出重定向到一個(gè)文件,主進(jìn)程就不會(huì)持續(xù)監(jiān)聽(tīng)了,注意2>&1必須加,必須把所有的輸出都追加到文件,文件地址可以是/dev/null
關(guān)于ES查詢(xún)的分頁(yè)問(wèn)題
這里的查詢(xún)分為兩種,一種是基于ES的DQL,就是用restfulAPI的調(diào)用方式,另一種是說(shuō)使用SQL語(yǔ)言進(jìn)行查詢(xún)。眾所周知在MYSQL里分頁(yè)可以使用limit 10,5來(lái)解決,第一個(gè)10是偏移量(offset),從第十個(gè)數(shù)據(jù)開(kāi)始讀取,第二個(gè)參數(shù)5說(shuō)明是一次取5個(gè)值,通過(guò)這種方式可以實(shí)現(xiàn)分頁(yè)。但是使用
POST /_sql?format=txt{"query": "SELECT CONTENT FROM XXX LIMIT 10,5" }ES報(bào)錯(cuò),不能識(shí)別逗號(hào),所以說(shuō)這個(gè)接口里的limit后面只支持一個(gè)參數(shù)。下面說(shuō)分別對(duì)應(yīng)這兩種方法的解決方案
-
DQL查詢(xún)方式
- from+size方式
- scroll方式
- search_after方式
- 參考:https://chunsoft.blog.csdn.net/article/details/91406928
-
SQL的查詢(xún)方式
- cursor(游標(biāo))方式
- 參考:https://blog.csdn.net/qq_42569136/article/details/115465322
- 參考:https://www.elastic.co/guide/en/elasticsearch/reference/current/sql-pagination.html
- 感覺(jué)這種方式和上面的search_after是一樣的,多用于數(shù)據(jù)導(dǎo)出,并不適用這種場(chǎng)景,且不能跳轉(zhuǎn),只能一頁(yè)一頁(yè)的讀
- fetch_size方案
- 參考:https://www.elastic.co/guide/en/elasticsearch/reference/current/sql-search-api.html#sql-search-api-request-body
- 可以看到這里有一個(gè)fetch_size的參數(shù),講道理應(yīng)該和上面一樣還有一個(gè)fetch_from就完美了,可惜是官方并沒(méi)有提供這個(gè)參數(shù),想不明白是為什么
-
最終的方案,使用先用/_sql/translate把SQL查詢(xún)變成DQL之后,再在DQL里面補(bǔ)充from和size字段,默認(rèn)情況下使用translate會(huì)自動(dòng)有一個(gè)size:1000的對(duì)象,如果SQL語(yǔ)句里有l(wèi)imit 100,這個(gè)1000就變成100了,但是不會(huì)自動(dòng)添加from
如果一行數(shù)據(jù),用指定的分割方式?jīng)]有分割出來(lái)怎么辦
直接把這個(gè)數(shù)據(jù)添加到message里,并不會(huì)丟棄
如果之前我們的filebeat的input.yml文件有一段時(shí)間為空,后面再加上還能正常工作嗎?
可以
采用上面的方案會(huì)導(dǎo)致,每次有新的數(shù)據(jù)加入log文件,都會(huì)把之前的所有內(nèi)容再重新傳一遍,導(dǎo)致重復(fù)采集
- 問(wèn)題出在vim編輯器,用echo添加就不會(huì)有問(wèn)題,估計(jì)是vim保存的時(shí)候創(chuàng)建了一個(gè)新的文件或者鏈接
- 參考:https://elasticsearch.cn/question/2533
vi指令保存后,會(huì)重復(fù)發(fā)送,用echo寫(xiě)東西測(cè)試沒(méi)問(wèn)題,類(lèi)似vi估計(jì)都會(huì)有問(wèn)題。官方論壇翻譯內(nèi)容如下:
你怎么修改文件。你試過(guò)了$ echo ‘new line’ >> /usr/src/app/log.log嗎?filebeat試圖根據(jù)元數(shù)據(jù)來(lái)檢測(cè)文件是否是新的。一些工具/編輯器創(chuàng)建一個(gè)全新的文件保存并取消舊鏈接。這被filebeat檢測(cè)為新文件,迫使它重新發(fā)送所有內(nèi)容。
上面使用[log][file][path]不太嚴(yán)謹(jǐn)
-
如果不同機(jī)器上有不同的業(yè)務(wù),但是log文件名都一樣,這樣就會(huì)把這些日志放在一個(gè)索引,其實(shí)不應(yīng)該放在一起
-
采用打tags的方式解決
-
filebeat_input.yml文件里加入tag
- type: log# Change to true to enable this input configuration.enabled: true# Paths that should be crawled and fetched. Glob based paths.paths:- /usr/local/xxxtags: wang1fields: source: wang_test - type: log# Change to true to enable this input configuration.enabled: true# Paths that should be crawled and fetched. Glob based paths.paths:- /usr/local/xxxtags: wang2fields: source: wang_testtags后面的值可以不帶引號(hào)
-
logstash配置文件根據(jù)這個(gè)tag去做相應(yīng)的處理
inputs {beats {port => 5044} }filter {if "wang1" in [tags]{dissect {mapping => {"message" => "%{wang_time} %{wang_pid} %{wang_level} %{comtent}"}}} }output {if "wang1" in [tags]{elasticsearch {hosts => "10.1.1.186:9200"index => "wang_test_666"}} }
總結(jié)
以上是生活随笔為你收集整理的使用Elasticsearch+filebeat+logstach+kibana构建日志服务平台的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Django多进程中的查询错乱问题以及m
- 下一篇: 关于指针的几个问题