Filebeat收集Elasticsearch7.3版本的慢日志

Elasticsearch7.3版本的慢日志收集

在这里插入图片描述

为什么要收集:

​ 最近由于线上的业务es的查询的出现了高负载,查询返回很慢的情况,开发经常找我们运维去拿日志,不管是es的节点集群日志,还是慢查询日志,还是索引的慢日志。在集群规模很小的时候可以写写脚本或者手动download下来就完事了,毕竟节点少。节点少也就意味着数据量小,业务量也不大。但是随着业务的增长,节点从之前的三个节点突增到了现在的18个节点的es集群。集群的日志量也比之前多的太多,开发看起来也不方便。像这种日志收集应该在很早之前就要弄掉的,方便你我他的事情,但是由于种种原因,一直没有排上日程,最后决定一定抽出两天时间来把这件事处理掉。期间也在网上看到过案例,怎么样收集,大多是直接收集到另一套es上面去了。感觉有点不怎么方便和舒适感,最后经过调研和实际的情况就决定采用上面的一套数据流。

业务es集群:版本7.3,节点数18,后面可能会继续增加

Filebeat:版本7.3,同样也需要18个。轻量级的中间件,我这边Filebeat目前只用做日志文件的收集,不对数据解析处理,直接output到kafka集群

kafka集群:版本:1.1.0 ,接收来自Filebeat的数据,为了数据的高可用性选择了kafka这一层数据暂存

logstash:版本:7.3 ,消费kafka的数据,对日志数据解析处理(没错数据处理解析放到了这里,稍微耗性能的和业务ES分开了)

ES日志收集集群:版本:7.3,另一套es集群,专门收集各种日志的,目前节点数较少5个,磁盘比较大,机械磁盘足以,并通过日志es集群的kibana进行展示

如何安装filebeat:

​ 安装包是rpm官网下载即可,通过ansible批量安装,配置文件COPY等

下载链接:https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.3.0-x86_64.rpm

部署:

部署的前提

了解kafka的生产消费的原理,才能对一些参数做适合自己环境的配置

一,Filebeat部署

Filebeat的介绍废话就不多说了,直接到官网地址可以看。

https://www.elastic.co/guide/en/beats/filebeat/7.3/filebeat-overview.html

filebeat如何配置input(log),output(kafka),官网的示例已经很清楚了,一定要多看官网示例。不然会走很多弯路

直接上Filebeat.yml文件:

#=========================== Filebeat inputs ============================= 
filebeat.inputs:
- type: log
  enabled: true
  paths:
    - /data01/elasticsearch/logs/elk_server.json
  multiline.type: pattern
  multiline.pattern: "stacktrace|Caused by|at|(\.{3})"
  multiline.negate: false
  multiline.match: after
  tail_files: true
  fields:
    kafka_topic: busi-es-log-topic
- type: log
  enabled: true
  paths:
    - /data01/elasticsearch/logs/elk_index_search_slowlog.json
  fields:
    kafka_topic: busi-es-search-slowlog-topic
- type: log
  enabled: true
  paths:
    - /data01/elasticsearch/logs/elk_index_indexing_slowlog.json
  fields:
    kafka_topic: busi-es-indexing-slowlog-topic
#================================ Outputs =====================================
output.kafka:
  hosts: ["192.168.88.182:9092","192.168.88.183:9092","192.168.88.184:9092"]
  topic: '%{[fields.kafka_topic]}'
  version: 1.1.0
  partition.round_robin:
    reachable_only: true
  compression: gzip
  compression_level: 4
  max_message_bytes: 5242880
  required_acks: 1
  codec.json:
    pretty: true
    escape_html: false

解释:

1、type为何会有三个:

因为我需要收集es的三个文件的日志

elk_server.json:业务es集群节点的日志

elk_index_search_slowlog.json:慢查询的日志

elk_index_indexing_slowlog.json:索引的慢日志

2、 multiline:

用这个模块是因为,java一般都有堆栈的异常信息,filebeat去读的时候可能会把这些堆栈的异常信息当成另一行的数据了,会导致logstash解析出错。

  multiline.type: pattern -> 启用正则
  multiline.pattern: "stacktrace|Caused by|at|(\.{3})" -> 匹配数据格式
  multiline.negate: false -> 定义是否否定模式。默认值为false
  multiline.match: after -> 追加到上一行的末尾
3、fields. kafka_topic字段

将不同文件的日志,输出到不同的kafka的topic里面,在output的时候就可以使用变量 ,来将不同的数据写到kafka里面。

4、output.kafka
  topic: '%{[fields.kafka_topic]}'  -> 该变量就是input里面定义的topic
  version: 1.1.0 -> kafka的版本
  required_acks: 1	->kafka生产者的配置(消息发送出去,分区的leader数据写入成功就认为数据发送成功)

配置output.kafka需要了解kafka的一些生产和消费的原理

二、logstash消费kafka

配置文件:

input {
  kafka {
    bootstrap_servers => "192.168.88.182:9092,192.168.88.183:9092,192.168.88.184:9092"
    topics => ["busi-es-indexing-slowlog-topic","busi-es-log-topic","busi-es-search-slowlog-topic"]
    group_id => "busi-es-slow-log"
    session_timeout_ms => "30000"
    codec => "json"
    consumer_threads => 9
    auto_offset_reset => "latest"
    enable_auto_commit => "true"
    auto_commit_interval_ms => "60000"
    decorate_events => true
  }
}
filter {
    json {
       source => "message"
    }
 ###对一些字段的特殊处理解析
 ruby {
     #将timestamp的值,赋予newtimestamp字段
     code => "event.set('newtimestamp', event.get('@timestamp')+ 8*60*60)"
 }
    mutate {
	convert => ["newtimestamp", "string"]
	split => ["newtimestamp","T"]
	#对data字段处理,结果示例2020.07.07
	gsub => ["[newtimestamp]", "-", "."]
        add_field => {
		"topic" => '%{[fields][kafka_topic]}'
		"currentdate" => '%{[newtimestamp][0]}'
  	}
  	##删除没必要的字段
        remove_field => ["fields","ecs","log","agent","host","node.id","type","cluster.uuid","newtimestamp"]
        
    }
}

output {
      if [topic] == "busi-es-log-topic" {
          elasticsearch {
            hosts => ["192.168.88.128:9200","192.168.99.93:9200","192.168.99.92:9200"]
            index => "busi-es-log-%{currentdate}"
            action => "index"
            template_name  => "elk-busi-es-keyword"
            user => elastic
            password => changeme }
        }
       else if [topic] == "busi-es-indexing-slowlog-topic" {
          elasticsearch {
            hosts => ["192.168.88.128:9200","192.168.99.93:9200","192.168.99.92:9200"]
            index => "busi-es-indexing-slowlog-%{currentdate}"
            action => "index"
	        template_name  => "elk-busi-es-keyword"
            user => elastic
            password => changeme }
        }
       else if [topic] == "busi-es-search-slowlog-topic" {
          elasticsearch {
            hosts => ["192.168.88.128:9200","192.168.99.93:9200","192.168.99.92:9200"]
            index => "busi-es-search-slowlog-%{currentdate}"
            action => "index"
	        template_name  => "elk-busi-es-keyword"
            user => elastic
            password => changeme }
        }
#stdout {
#    codec => rubydebug
#}
}
1、input

只解释个别参数设置:

codec => "json"  -> 输入为json的数据格式,如果不是json的数据格式会抛异常,就说明filebeat的数据个是匹配有问题还需要重新调整正则
consumer_threads => 9 -> 消费者的线程,一般和topic的分区数相等
auto_offset_reset => "latest"  ->提交偏移量的模式
2、filter
json {
   source => "message"
}
将json的字段,转换成顶级目录的字段模式,可以对字段直接操作解析等
3、output
index => "busi-es-log-%{currentdate}" -> 按照截取出来的currentdate字段按天创建索引
template_name  => "elk-busi-es-keyword"  -> 这里是指定索引使用固定的mapping模板,我这里是将一些字段固定成了 keyword的查询,关闭了text

三 、 Kibana展示

在这里插入图片描述
1、将json里面的字段变为顶级的字段
2、异常java的堆栈信息也可以正常解析
3、后面可还需要调整正则匹配模式,目前只是粗略的匹配

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值