使用ELK搭建日志存储分析平台

思考的稻草人 2017-09-26

ELK Stack 简介

ELK 不是一款软件,而是 Elasticsearch、Logstash 和 Kibana 三种软件产品的首字母缩写。这三者都是开源软件,通常配合使用,而且又先后归于 Elastic.co 公司名下,所以被简称为 ELK Stack。根据 Google Trend 的信息显示,ELK Stack 已经成为目前最流行的集中式日志解决方案。

  • Elasticsearch:分布式搜索和分析引擎,具有高可伸缩、高可靠和易管理等特点。基于 Apache Lucene 构建,能对大容量的数据进行接近实时的存储、搜索和分析操作。通常被用作某些应用的基础搜索引擎,使其具有复杂的搜索功能;
  • Logstash:数据收集引擎。它支持动态的从各种数据源搜集数据,并对数据进行过滤、分析、丰富、统一格式等操作,然后存储到用户指定的位置;
  • Kibana:数据分析和可视化平台。通常与 Elasticsearch 配合使用,对其中数据进行搜索、分析和以统计图表的方式展示;
  • Filebeat:ELK 协议栈的新成员,一个轻量级开源日志文件数据搜集器,基于 Logstash-Forwarder 源代码开发,是对它的替代。在需要采集日志数据的 server 上安装 Filebeat,并指定日志目录或日志文件后,Filebeat 就能读取数据,迅速发送到 Logstash 进行解析,亦或直接发送到 Elasticsearch 进行集中式存储和分析。

Beats 作为日志搜集器

这种架构引入 Beats 作为日志搜集器。目前 Beats 包括四种:

  • Packetbeat(搜集网络流量数据);
  • Topbeat(搜集系统、进程和文件系统级别的 CPU 和内存使用情况等数据);
  • Filebeat(搜集文件数据);
  • Winlogbeat(搜集 Windows 事件日志数据)。

Beats 将搜集到的数据发送到 Logstash,经 Logstash 解析、过滤后,将其发送到 Elasticsearch 存储,并由 Kibana 呈现给用户。详见图 3。

图 3. Beats 作为日志搜集器

使用ELK搭建日志存储分析平台

 

这种架构解决了 Logstash 在各服务器节点上占用系统资源高的问题。相比 Logstash,Beats 所占系统的 CPU 和内存几乎可以忽略不计。另外,Beats 和 Logstash 之间支持 SSL/TLS 加密传输,客户端和服务器双向认证,保证了通信安全。

因此这种架构适合对数据安全性要求较高,同时各服务器性能比较敏感的场景。

基于 Filebeat 架构的配置部署详解

前面提到 Filebeat 已经完全替代了 Logstash-Forwarder 成为新一代的日志采集器,同时鉴于它轻量、安全等特点,越来越多人开始使用它。这个章节将详细讲解如何部署基于 Filebeat 的 ELK 集中式日志解决方案,具体架构见图 5。

图 5. 基于 Filebeat 的 ELK 集群架构

使用ELK搭建日志存储分析平台

 

因为免费的 ELK 没有任何安全机制,所以这里使用了 Nginx 作反向代理,避免用户直接访问 Kibana 服务器。加上配置 Nginx 实现简单的用户认证,一定程度上提高安全性。另外,Nginx 本身具有负载均衡的作用,能够提高系统访问性能。

系统信息

平台

笔者使用的是CentOS7。

JDK

JDK 是 IBM Java 8。ELK 需要 Oracle 1.7(或者是 OpenJDK 1.7) 及以上,如果是 IBM Java,则需要 8 及以上的版本。

软件版本

  • Filebeat:5.5.2;
  • Logstash:5.5.2;
  • Elasticsearch:5.5.2;
  • Kibana:5.5.2;
  • Nginx:1.8.1。

Filebeat + ELK 安装

安装步骤

ELK 官网对于每种软件提供了多种格式的安装包(zip/tar/rpm/DEB),以 Linux 系列系统为例,如果直接下载 RPM,可以通过 rpm -ivh path_of_your_rpm_file 直接安装成系统 service。以后就可以使用 service 命令启停。比如 service elasticsearch start/stop/status

  • 创建 elk 用户和用户组;
    groupadd elk          # 添加用户组
    useradd -g elk elk    # 添加用户到指定用户组
    passwd elk            # 为指定用户设置密码

    切换到新创建的 elk 用户做如下操作。

  • 下载安装包;如果待安装机器能访问外网,可以直接用以下命令下载安装包。
    wget https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-5.2.2-x86_64.rpm
    wget https://artifacts.elastic.co/downloads/logstash/logstash-5.2.2.rpm
    wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-5.2.2.rpm
    wget https://artifacts.elastic.co/downloads/kibana/kibana-5.2.2-x86_64.rpm
  • 下载依赖包;
    yum install java java-1.8.0-openjdk-devel.x86_64
  • 安装;
    rpm -ivh filebeat-5.2.2-x86_64.rpm
    rpm -ivh logstash-5.2.2.rpm
    rpm -ivh elasticsearch-5.2.2.rpm
    rpm -ivh kibana-5.2.2-x86_64

     

FILEBEAT

Filebeat 和 ELK 的安装很简单,比较难的是如何根据需求进行配置。这个章节简单介绍一下配置需求和配置方法。

  • Filebeat配置:Filebeat被安装在 /usr/share/filebeat 中,配置文件为 /etc/filebeat/filebeat.yml
    1
    2
    3
    4
    5
    filebeat.prospectors:
    - input_type: log
    paths:
    - /var/log/*.log
    #- c:\programdata\elasticsearch\logs\*

    对于最基本的Filebeat配置,您可以使用单个路径定义单个探测器。在这个例子中,探测器收录路径/var/log/*.log中的所有文件,这意味着Filebeat将收集以.log结尾的目录/var/log /中的所有文件。 Golang Glob支持的所有模式也在此支持。

  • Filebeat配置Logstash作为输出:您可以编辑Filebeat配置文件以通过注释elasticsearch菜单来禁用elasticsearch搜索输出,并通过取消注释logstash部分来启用Logstash输出:
    #----------------------------- Logstash output --------------------------------<br>output.logstash:<br>hosts: ["127.0.0.1:5044"]
  • 启动Filebeat:sudo /etc/init.d/filebeat start
  • 更多

Logstash

首先,我们通过运行最基本的Logstash管道来测试您的Logstash安装。Logstash管道有两个必需元素,输入和输出以及一个可选元素,过滤器。 输入插件消耗来自源的数据,过滤器插件会按照您指定的方式修改数据,并且输出插件将数据写入到目的地。

使用ELK搭建日志存储分析平台

测试您的Logstash安装,运行最基本的Logstash管道。 例如:

/usr/share/logstash/bin/logstash -e 'input { stdin { } } output { stdout {} }'

-e标志使您能够直接从命令行指定配置。 在命令行中指定配置可以快速测试配置,而无需在迭代之间编辑文件。 示例中的流水线从标准输入stdin输入,并将该输入以结构化格式移动到标准输出stdout。

启动Logstash后,等到看到“Pipeline main started”,然后在命令提示符下输入hello world,会看到如下输出:

1
2
3
4
5
6
{
    "@timestamp" => 2017-04-13T06:02:08.393Z,
    "@version" => "1",
    "host" => "localhost.localdomain",
    "message" => "hello world"
}

恭喜! 您已创建并运行基本的Logstash管道。 接下来,将学习如何创建更逼真的管道。

  • Logstash与Filebeat整合:刚刚我们配置了Filebeat,使Filebeat输出到Logstash中,现在我们要在配置文件中接收,创建一个 first-pipeline.conf
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    input {
        beats {
            port => "5044"
        }
    }
    # The filter part of this file is commented out to indicate that it is
    # optional.
    # filter {
    #
    # }
    output {
        stdout { codec =&gt; rubydebug }
    }

    保存后运行 bin/logstash -f first-pipeline.conf --config.test_and_exit–config.test_and_exit 选项解析您的配置文件并报告任何错误。如果配置文件通过配置测试,请使用以下命令启动Logstash:bin/logstash -f first-pipeline.conf --config.reload.automatic 
    –config.reload.automatic 选项启用自动配置重新加载,以便每次修改配置文件时不必停止并重新启动Logstash。如果您的管道正常工作,您应该看到一系列类似于写入控制台的事件:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    {
            "request" => "/",
              "agent" => "\"spiderman\"",
              "geoip" => {
                  "timezone" => "Asia/Shanghai",
                        "ip" => "42.156.251.187",
                  "latitude" => 30.2936,
               "coordinates" => [
                [0] 120.1614,
                [1] 30.2936
            ],
            "continent_code" => "AS",
                 "city_name" => "Hangzhou",
             "country_code2" => "CN",
              "country_name" => "China",
             "country_code3" => "CN",
               "region_name" => "Zhejiang",
                  "location" => [
                [0] 120.1614,
                [1] 30.2936
            ],
                 "longitude" => 120.1614,
               "region_code" => "33"
        },
             "offset" => 146998,
               "auth" => "-",
              "ident" => "-",
         "input_type" => "log",
               "verb" => "GET",
             "source" => "/usr/local/nginx/logs/shortUrl.access.log",
               "type" => "nginx_access",
               "tags" => [
            [0] "beats_input_codec_plain_applied"
        ]}
  • Logstash插件: Logstash提供了非常丰富的插件来处理各种日志,并且进行格式化日志。安装也非常的便捷。使用命令 bin/logstash-plugin list 来查看具体插件
  • 使用Grok Filter Plugin解析Web日志:Grok过滤器插件使您能够将非结构化日志数据解析成结构化和可查询的内容。编辑first-pipeline.conf文件,并将整个过滤器部分替换为以下文本:
    1
    2
    3
    4
    5
    filter {
    grok {
    match => { "message" => "%{COMBINEDAPACHELOG}"}
    }
    }

    保存更改。 由于您已启用自动配置重新加载,因此您不必重新启动Logstash来接收更改。

  • 使用Geoip Filter插件增强您的数据:除了解析日志数据以获得更好的搜索之外,过滤插件也可以从现有数据中导出补充信息。 例如,geoip插件查找IP地址,从地址中导出地理位置信息,并将该位置信息添加到日志中。将Logstash实例配置为使用geoip过滤器插件,将以下行添加到 first-pipeline.conf:
    1
    2
    3
    geoip {
    source => "clientip"
    }

测试我们的更改,我们需要强制Filebeat从头开始读取日志文件。 要执行此操作,请转到Filebeat正在运行的终端窗口,然后按Ctrl + C关闭Filebeat。 然后删除Filebeat注册表文件。 例如,运行:
<br>sudo rm data/registry<br>
由于Filebeat存储注册表中收集的每个文件的状态,因此删除注册表文件会强制Filebeat读取从头开始捕获的所有文件。接下来重新启动Filebeat来验证我们的输出内容。

相关推荐