0 说明

本次EFK分布式日志收集系统节点安排如下:

主机名

主机ip

部署情况

chen-1

192.168.218.100

Elasticsearsh Logstash Filebeat Namenode ResourceManager ZK

chen-2

192.168.218.101

Elasticsearsh SecondaryNamenode Datanode Nodemanager ZK

chen-3

192.168.218.102

Elasticsearsh Datanode Nodemanager ZK

chen-4

192.168.218.103

Kibana Datanode Nodemanager

chen-5

192.168.218.104

Datanode Nodemanager

Filebeat和Logstash都具有日志采集功能,不同的是Filebeat是轻量级的,Logstash运行在JVM上,但其功能更强大。本文采用Filebeat+Logstash方式采集日志。

1 logstash介绍

Logstash是一个开源的数据收集引擎,它具有备实时数据传输能力。它可以统一过滤来自不同源的数据,并按照开发者制定的规范输出到目的地,支持正则表达式。
由于日志文件来源多(如:系统日志、服务器日志、tomcat日志、nginx日志等),且内容杂乱,不便于人类进行观察。因此,我们可以使用 Logstash 对日志文件进行收集和统一过滤,变成可读性高的内容
下载对应的Logstash-6.6.2版本,并解压安装。

2 案例1

Filebeat采集数据放入Lostash中过滤,再存入Elasticsearsh中,最后通过Kibana进行页面展示。
启动

./logstash -e 'input {stdin{}} output{stdout{}}' 表示标准输入和标准输出

filebeat多个日志输出多条索引 redis filebeat采集多个日志_java


此时,启动成功。我们在控制台输入内容就会打印出相应的内容

filebeat多个日志输出多条索引 redis filebeat采集多个日志_java_02

2.1 配置文件

logstash -f logstash.conf
input {
    # 从文件读取日志信息
    file {
        path => "/var/log/messages"
        type => "system"
        start_position => "beginning"
    }
}

filter {
}

output {
    # 标准输出
    stdout {}
}

插件分类:

inputs 输入

codecs 解码

filters 过滤

outputs 输出

filebeat多个日志输出多条索引 redis filebeat采集多个日志_java_03


指定日志路径,日志类型和起始位置;没有过滤;输出为标准输出。

logstash -f logstash.conf启动

可以看到采集的日志如下

filebeat多个日志输出多条索引 redis filebeat采集多个日志_数据库_04


Gemfile中内置了Logstash内置的插件,根据不同的插件,我们可以将采集不同类型的日志文件,并进行过滤输出等操作。

如使用filter插件,更改配置文件,写入如下内容

input {
    stdin {
    }
}

filter {
   mutate {
        split => ["message", "|"]
    }
}

output {
    stdout {
    }
}

filebeat多个日志输出多条索引 redis filebeat采集多个日志_java_05


此时会把“|”过滤掉,并得到相应的数组。

filebeat多个日志输出多条索引 redis filebeat采集多个日志_数据库_06


数据处理流程:

input->解码->filter->编码->output

输出到elasticsearch:

input {
    # 从文件读取日志信息
    file {
        path => "/var/log/messages-20200906"
        type => "system"
        start_position => "beginning"
    }
}

filter {
}

output {
    elasticsearch {
        hosts => ["192.168.218.100:9200"]
        index => "msg-%{+YYYY.MM.dd}"
    }
}

启动

filebeat多个日志输出多条索引 redis filebeat采集多个日志_大数据_07


此时进入kibana中查看,发现在es的索引中已经新建了一个msg-*的索引

filebeat多个日志输出多条索引 redis filebeat采集多个日志_elasticsearch_08


可以对其内容进行查询

filebeat多个日志输出多条索引 redis filebeat采集多个日志_数据库_09


filebeat多个日志输出多条索引 redis filebeat采集多个日志_大数据_10

4 案例2

使用Logstash收集nginx的日志

新建配置文件,并输入如下内容:

filebeat多个日志输出多条索引 redis filebeat采集多个日志_java_11

启动./bin/logstash -f ./config/logstash-nginx.conf

filebeat多个日志输出多条索引 redis filebeat采集多个日志_java_12


可以看到logstash已经把nginx中的日志输出来了。

再页面重新访问

http://192.168.218.100/chen/hello

filebeat多个日志输出多条索引 redis filebeat采集多个日志_大数据_13


增加nginx日志输出,查看是否是实时输出的。

filebeat多个日志输出多条索引 redis filebeat采集多个日志_elasticsearch_14


可以看到其实时输出了日志

接下来,我们再把nginx的输出日志存入es中

input {
    file {
        path => "/usr/local/nginx/logs/access.log"
        type => "nginxaccess"
        start_position => "beginning"
    }
}

filter {
    grok {  
      match => { "message" => "%{HTTPD_COMBINEDLOG}" }
    }
}

output {
    elasticsearch {
        hosts => ["192.168.218.100:9200"]
        index => "nginx-%{+YYYY.MM.dd}"
    }
}

修改logstash-nginx.conf配置文件,再重新启动,刷新kibana页面。可以看到es的索引中新增加了nginx标签

filebeat多个日志输出多条索引 redis filebeat采集多个日志_大数据_15