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进行消费,此架构可大大提升稳定性。

希望本文对你有帮助,请点个赞鼓励一下作者吧~ 谢谢!

猜你喜欢

转载自blog.csdn.net/wsdc0521/article/details/106344073