如何快速搭建一个简易的ELK日志分析系统

一、ELK简介

  ELK就是一款非常优秀的、开源的、用于搭建实时日志分析平台的组件。ELK是Elasticsearch、Logstash和Kiabana这3款开源框架首字母的缩写。通过这三个组件,构建一个统一的日志管理系统,用来收集分布式部署系统中分散在不同设备上的日志,方便后续进行日志分析。
  其中,Elasticsearch是一个实时的分布式搜索和分析引擎,建立在全文搜索引擎Apache Lucene基础之上,使用Java语言编写,具有分布式、高可用性、易扩展、具有副本和索引自动分片功能、提供基于HTTP协议以JSON为数据交互格式的REST风格API、多数据源、实时分析存储等特点。
  Logstach主要用于对日志进行收集、过滤,对数据进行格式化处理,并将所收集的日志传输到相关系统进行存储。Logstash是用Ruby语言开发的,由数据输入端、过滤器和数据输出端3部分组成。其中数据输入端可以从数据源采集数据,过滤器是数据处理层,包括对数据进行格式化处理、数据类型转换、数据过滤等,支持正则表达式;数据输出端是将Logstash收集的数据经由过滤器处理后输出到其他系统,Kafka、HDFS、Elasticsearch等。
  Kibana是一款针对Elasticsearch开源分析及可视化平台,使用node.js开发,可用来搜索,展示存储在Elasticsearch中的数据。同时提供了丰富的图表模板,只需通过简单的配置就可以方便地进行高级数据分析和绘制各种图表。
  其实,在实际的ELK系统中,还需要配置一个日志收集器,比如FileBeats等。安装在每台需要收集日志的服务器上,将日志发送给Logstash进行处理,所以Beats是一个“搬运工”,将你的日志搬运到日志收集服务器上。这篇博文暂时先不考虑这类组件。

二、需要环境

1、关闭防火墙(生产环境开放对应端口即可)
2、JDK环境,请参考《CentOS7环境安装jdk、tomcat及其配置环境变量》博文。

三、Elasticsearch安装

1、下载Elasticsearch,这里选择Elasticsearch6.3.1这个版本,命令如下:

#当前目录:/usr/local/soft/ELKB/
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.3.1.tar.gz

2、解压

#当前目录:/usr/local/soft/ELKB/
 tar -zvxf elasticsearch-6.3.1

3、修改配置文件
  入门教程,本着尽量使用默认配置的原则,修改配置文件/usr/local/soft/ELKB/elasticsearch-6.3.1//config/elasticsearch.yml文件,添加如下配置即可:

network.host: 192.168.1.8
http.port: 9200

其中,/usr/local/soft/ELKB/elasticsearch-6.3.1/表示elasticsearch-6.3.1解压后的根目录,根据实际情况即可。
3、创建启动elasticsearch的用户(elasticsearch不能够使用root用户启动)

adduser elkb
 # 将es的拥有者和group改为elk
chown -R elkb:elkb /usr/local/soft/ELKB/elasticsearch-6.3.1/

4、切换用户(elkb),启动elasticsearch

#切换用户
su elkb
#启动elasticsearch,当前所在目录/usr/local/soft/ELKB/elasticsearch-6.3.1/
bin/elasticsearch

5、验证
访问http://192.168.1.8:9200/,出现如下界面,说明启动成功。
在这里插入图片描述

四、Kibana 安装

1、下载Kibana ,这里选择kibana6.3.1这个版本(和elasticsearch同步),命令如下:

#当前目录:/usr/local/soft/ELKB/
wget https://artifacts.elastic.co/downloads/kibana/kibana-6.3.1-linux-x86_64.tar.gz

2、解压

#当前目录:/usr/local/soft/ELKB/
tar -zvxf kibana-6.3.1-linux-x86_64.tar.gz

3、修改配置文件
修改配置文件/usr/local/soft/ELKB/kibana-6.3.1-linux-x86_64/config/kibana.yml文件,添加如下配置即可:

# Kibana 端口
server.port: 5601
# Kibana ip
server.host: "192.168.1.8"
# elasticsearch  地址
elasticsearch.url: "http://192.168.1.8:9200"

4、启动

#启动kebana,当前目录/usr/local/soft/ELKB/kibana-6.3.1-linux-x86_64
bin/kibana

5、验证
访问http://192.168.1.8:5601,出现如下界面,说明成功。
在这里插入图片描述

五、Logstash 安装

1、下载Logstash ,这里选择Logstash6.3.1 这个版本(和elasticsearch同步),命令如下:

#当前目录:/usr/local/soft/ELKB/
wget https://artifacts.elastic.co/downloads/logstash/logstash-6.3.1.tar.gz

2、解压

#当前目录:/usr/local/soft/ELKB/
tar -zxvf logstash-6.3.1.tar.gz

3、验证
在/usr/local/soft/ELKB/logstash-6.3.1目录下,通过执行bin/logstash -e ‘input { stdin { } } output { stdout {} }’,然后在输入hello,出现如下界面说明,logstash可以正常使用。

#当前目录:/usr/local/soft/ELKB/logstash-6.3.1
[root@node08 logstash-6.3.1]# bin/logstash -e 'input { stdin { } } output { stdout {} }'
hello #
Sending Logstash's logs to /usr/local/soft/ELKB/logstash-6.3.1/logs which is now configured via log4j2.properties
[2020-05-14T13:23:50,509][INFO ][logstash.setting.writabledirectory] Creating directory {:setting=>"path.queue", :path=>"/usr/local/soft/ELKB/logstash-6.3.1/data/queue"}
[2020-05-14T13:23:50,534][INFO ][logstash.setting.writabledirectory] Creating directory {:setting=>"path.dead_letter_queue", :path=>"/usr/local/soft/ELKB/logstash-6.3.1/data/dead_letter_queue"}
[2020-05-14T13:23:51,495][WARN ][logstash.config.source.multilocal] Ignoring the 'pipelines.yml' file because modules or command line options are specified
[2020-05-14T13:23:51,699][INFO ][logstash.agent           ] No persistent UUID file found. Generating new UUID {:uuid=>"95edb338-9c94-47d4-b357-4406ffa6ba33", :path=>"/usr/local/soft/ELKB/logstash-6.3.1/data/uuid"}
[2020-05-14T13:23:52,846][INFO ][logstash.runner          ] Starting Logstash {"logstash.version"=>"6.3.1"}
[2020-05-14T13:23:55,728][INFO ][logstash.pipeline        ] Starting pipeline {:pipeline_id=>"main", "pipeline.workers"=>4, "pipeline.batch.size"=>125, "pipeline.batch.delay"=>50}
[2020-05-14T13:23:56,398][INFO ][logstash.pipeline        ] Pipeline started successfully {:pipeline_id=>"main", :thread=>"#<Thread:0x55098452 run>"}
The stdin plugin is now waiting for input:
[2020-05-14T13:23:56,532][INFO ][logstash.agent           ] Pipelines running {:count=>1, :running_pipelines=>[:main], :non_running_pipelines=>[]}
{
       "message" => "hello",
      "@version" => "1",
    "@timestamp" => 2020-05-14T05:23:56.445Z,
          "host" => "node08"
}
[2020-05-14T13:23:57,375][INFO ][logstash.agent           ] Successfully started Logstash API endpoint {:port=>9600}

六、示例

  通过上述步骤,已经完成了三个组件的安装工作,下面来实现读取nginx访问日志,并写入到ES中的例子,保证存在/usr/local/nginx/logs/access.log访问日志(目录可以随意),用来作为logstash采集日志的来源。

1、配置logstash采集处理日志的配置

在/usr/local/soft/ELKB/logstash-6.3.1目录,创建job目录(目录自定义,可以随意),然后进入目录创建一个nginx.conf文件,内容如下:

input {#配置日志来源,使用固定文件的方式
  file{
        path => "/usr/local/nginx/logs/access.log"
        start_position => "beginning"
        type => "nginx_access_log"
  }
}
 
filter {
  if [type] == "nginx" { # 这里的type是日志类型
    grok {
      match => { "message" => "%{COMBINEDAPACHELOG} %{QS:gzip_ratio}" } # 使用自带的pattern即可,注意空格
    }
    # 更改匹配到的字段的数据类型
    mutate {
      convert => ["response", "integer"]
      convert => ["bytes", "integer"]
      convert => ["responsetime", "float"]
    }
    # 指定时间戳字段以及具体的格式
    date {
      match => ["timestamp", "dd/MMM/YYYY:HH:mm:ss Z"]
      remove_field => ["timestamp"]
    }
  }
} 
output {#配置elasticsearch作为输出目的地
  elasticsearch {
    hosts => [ "192.168.1.8:9200" ]
    index => "%{type}-%{+YYYY.MM.dd}" # index中含有时间戳
  }
}

2、根据上述nginx.conf文件重新启动logstash,命令如下:

#当前目录:/usr/local/soft/ELKB/logstash-6.3.1下,执行如下命令
# bin/logstash -f job/nginx.conf

注意:执行较慢,需要等待。

3、配置ES的Index的Mapping信息
通过执行如下命令即可。

curl -H "Content-Type: application/json" -XPUT 192.168.1.8:9200/_template/nginx -d '
{
  "template": "nginx*",
  "mappings": {
    "_default_": {
      "properties": {
        "clientip": {
          "type": "keyword"
        },
        "ident": {
          "type": "keyword"
        },
        "auth": {
          "type": "keyword"
        },
        "verb": {
          "type": "keyword"
        },
        "request": {
          "type": "keyword"
        },
        "httpversion": {
          "type": "keyword"
        },
        "rawrequest": {
          "type": "keyword" 
        },
        "response": {
          "type": "keyword"
        },
        "bytes": {
          "type": "integer"
        },
        "referrer": {
          "type": "keyword"
        },
        "agent": {
          "type": "keyword"
        },
        "gzip_ratio": {
          "type": "keyword"
        }
      }
    }
  }
}'

4、使用Kibana查看Elasticsearch索引数据

  1. 通过访问【http://192.168.1.8:5601】打开Kibana界面,找到Management菜单,如下图所示:在这里插入图片描述
  2. 创建索引的匹配规则(正则表达式),点击下一步在这里插入图片描述
  3. 创建索引,选择“I don’t want to use the Time Filter”,然后点击创建按钮。
    在这里插入图片描述
  4. 点击创建后,进入如下页面,说明创建成功
    在这里插入图片描述
  5. 点击Disconer菜单,这个时候,就可以看到了nginx访问日志中数据了,如下所示。
    在这里插入图片描述

七、写在最后

  在这篇博文中,我们只是简单的演示了如何部署ELK中的三个组件,和配置了一个简单读取nginx访问日志的示例,下一篇文章中,我们将引入FileBeats组件,从而真正实现动态读取在多台服务器上的日志文件。
  在另外一篇博文中,专门记录了在安装部署ELK过程中遇见的问题和解决方案,请参考《在搭建ELK日志分析系统中的常见问题和解决方案》

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