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