前面提到過,logstash佔資源很大,filebeat更加輕量,一般都是組合使用,難免會有logstash宕掉的時候,這時候filebeat再往logstash裏寫數據就寫不了了,這期間的日誌信息可能就無法採集到了,因此一般都會採用redis或kafka作爲一個消息緩衝層,本篇就介紹如何使用Redis作爲數據緩衝層,將filebeat的數據落地到Redis中然後由Logstash消費並寫入至ES。
ELK系列(一)、安裝ElasticSearch+Logstash+Kibana+Filebeat-v7.7.0
ELK系列(二)、在Kibana中使用RESTful操作ES庫
ELK系列(四)、Logstash讀取nginx日誌寫入ES中
ELK系列(五)、Logstash修改@timestamp時間爲日誌的產生時間
ELK系列(六)、修改Nginx日誌爲Json格式並使用Logstash導入至ES
ELK系列(七)、Filebeat+Logstash採集多個日誌文件並寫入不同的ES索引中
-------------------------------使用Filebeat+Redis+Logstash收集日誌數據------------------------------
Filebeat配置
首先配置Filebeat的yml文件,這裏還使用之前用過的採集nginx的access-json.json日誌的配置文件改一改,採集nginx的訪問日誌並寫入到redis中,指定key爲"nginx",在db0內,數據類型爲list:
vim /opt/app/filebeat-7.7.0-linux-x86_64/filebeat_redis.yml
filebeat.inputs:
- type: log
enabled: true
backoff: "1s"
tail_files: false
paths:
- /usr/local/nginx/logs/access-json.log
fields:
filetype: log_nginxjson
fields_under_root: true
output.redis:
enabled: true
hosts: ["wykd:6379"]
password: 123456
key: nginx
db: 0
datatype: list
如果redis沒有開啓密碼的話,這裏的password參數可以不寫。更加詳細的參數配置可參考$FILEBEAT_HOME下的filebeat.reference.yml文件。
Logstash配置
logstash的配置文件也拿之前的讀nginx日誌文件寫到es的配置文件改一改,把input改成從redis取數據,這裏的password也是按需配置,key,data_type,db,host,port需要與上面filebeat配置的一致。
vim /opt/app/logstash-7.7.0/config/logstash_nginxlog2es_redis.conf
input {
# 從文件讀取日誌信息
redis {
host => "wykd"
port => 6379
password => "123456" #如果沒有密碼不需要寫這個參數
key => "nginx"
data_type => "list"
db =>0
}
}
filter {
json {
source => "message"
remove_field => ["beat","offset","tags","prospector"] #移除字段,不需要採集
}
date {
match => ["timestamp", "dd/MMM/yyyy:HH:mm:ss Z"] #匹配timestamp字段
target => "@timestamp" #將匹配到的數據寫到@timestamp字段中
}
}
output {
# 輸出es
elasticsearch {
hosts => ["wykd:9200"]
index => "redis-%{+YYYY.MM.dd}"
}
}
啓動驗證
首先啓動logstash,然後啓動filebeat:
cd $LS_HOME
bin/logstash -f config/logstash_nginxlog2es_redis.conf
cd $FILEBEAT_HOME
./filebeat -e -c filebeat_redis.yml
進入kibana查看index,可以看到redis-*的index已經創建出來了,並且有14條數據:
訪問nginx網頁三次進行測試:
curl http://wykd/wyk.html
curl http://wykd/abc.html
curl http://wykd
可以看到這三次訪問記錄已經進來了,變成了17條記錄:
此時我們關閉logstash進程,模擬一下logstash關閉的情況下,如果繼續給nginx新增日誌的話,filebeat和redis裏的數據是什麼樣的:
1. 關閉logstash
2. 模擬登陸nginx:
curl http://wykd/111.html
curl http://wykd/222.html
3. 查看redis數據
可以看到在redis的db0的key=nginx裏已經緩存了這兩條日誌記錄, 當我們再次重啓logstash的時候,它就會自動從redis中將緩存的日誌記錄消費到ES中:
1. 再次啓動logstash進程
bin/logstash -f config/logstash_nginxlog2es_redis.conf
2. 驗證redis數據
3. 驗證es中的index記錄數
線上都是在各應用客戶端使用filebeat採集日誌,然後推送到redis或kafka集羣內,然後由logstash進行消費,此架構可大大提升穩定性。
希望本文對你有幫助,請點個贊鼓勵一下作者吧~ 謝謝!