ELK系列(八)、使用Filebeat+Redis+Logstash收集日誌數據

前面提到過,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插件及打包離線安裝包

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進行消費,此架構可大大提升穩定性。

 

希望本文對你有幫助,請點個贊鼓勵一下作者吧~ 謝謝!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章