如何使用Logstash和Kibana在CentOS7上集中日志

来自菜鸟教程
跳转至:导航、​搜索

介绍

在本教程中,我们将介绍在 CentOS 7 上安装 Logstash 1.4.2 和 Kibana 3,以及如何配置它们以在集中位置收集和可视化我们系统的 syslog。 Logstash 是一个开源工具,用于收集、解析和存储日志以供将来使用。 Kibana 3 是一个 Web 界面,可用于搜索和查看 Logstash 已索引的日志。 这两个工具都基于 Elasticsearch。 Elasticsearch、Logstash 和 Kibana 一起使用时称为 ELK 堆栈。

在尝试识别服务器或应用程序的问题时,集中式日志记录非常有用,因为它允许您在一个地方搜索所有日志。 它也很有用,因为它允许您通过在特定时间范围内关联它们的日志来识别跨多个服务器的问题。

可以使用 Logstash 收集所有类型的日志,但我们会将本教程的范围限制为 syslog 收集。

注意: 可以在此处找到本指南的更新版本:如何在 CentOS 7 上安装 Elasticsearch、Logstash 和 Kibana 4。

我们的目标

本教程的目标是设置 Logstash 以收集多个服务器的 syslog,并设置 Kibana 以可视化收集的日志。

我们的 Logstash / Kibana 设置有四个主要组件:

  • Logstash:Logstash 处理传入日志的服务器组件
  • Elasticsearch:存储所有日志
  • Kibana:用于搜索和可视化日志的 Web 界面
  • Logstash Forwarder:安装在将日志发送到 Logstash 的服务器上,Logstash Forwarder 作为日志转发代理,利用 lumberjack 网络协议与 Logstash 通信

我们将在单个服务器上安装前三个组件,我们将其称为 Logstash Server。 Logstash Forwarder 将安装在我们要为其收集日志的所有服务器上,我们将它们统称为 Servers

先决条件

要完成本教程,您将需要 CentOS 7 VPS 的 root 访问权限。 可以在此处找到设置说明(步骤 3 和 4): 使用 CentOS 6 进行初始服务器设置。

Logstash 服务器所需的 CPU、RAM 和存储量取决于您打算收集的日志量。 对于本教程,我们将为 Logstash 服务器使用具有以下规格的 VPS:

  • 操作系统:CentOS 7
  • 内存:2GB
  • 中央处理器:2

除了 Logstash 服务器之外,您还需要一些其他服务器来收集日志。

让我们开始设置我们的 Logstash 服务器吧!

安装 Java 7

Elasticsearch 和 Logstash 需要 Java 7,所以我们现在就安装它。 我们将安装 OpenJDK 7。

使用以下命令安装最新稳定版本的 OpenJDK 7:

sudo yum -y install java-1.7.0-openjdk

现在已经安装了 Java 7,让我们安装 ElasticSearch。

安装 Elasticsearch

:Logstash 1.4.2 推荐 Elasticsearch 1.1.1。

运行以下命令将 Elasticsearch 公共 GPG 密钥导入 rpm:

sudo rpm --import http://packages.elasticsearch.org/GPG-KEY-elasticsearch

为 Elasticsearch 创建和编辑一个新的 yum 存储库文件:

sudo vi /etc/yum.repos.d/elasticsearch.repo

添加以下存储库配置:

[elasticsearch-1.1]
name=Elasticsearch repository for 1.1.x packages
baseurl=http://packages.elasticsearch.org/elasticsearch/1.1/centos
gpgcheck=1
gpgkey=http://packages.elasticsearch.org/GPG-KEY-elasticsearch
enabled=1

保存并退出。

使用以下命令安装 Elasticsearch 1.1.1:

sudo yum -y install elasticsearch-1.1.1

现在已安装 Elasticsearch。 让我们编辑配置:

sudo vi /etc/elasticsearch/elasticsearch.yml

在文件的某处添加以下行,以禁用动态脚本:

script.disable_dynamic: true

您还需要限制对 Elasticsearch 实例的外部访问,因此外部人员无法通过 HTTP API 读取您的数据或关闭您的 Elasticseach 集群。 找到指定 network.host 的行并取消注释,使其看起来像这样:

network.host: localhost

然后通过找到 discovery.zen.ping.multicast.enabled 项并取消注释来禁用多播,如下所示:

discovery.zen.ping.multicast.enabled: false

保存并退出elasticsearch.yml

现在启动 Elasticsearch:

sudo systemctl start elasticsearch.service

然后运行以下命令在启动时启动 Elasticsearch:

sudo systemctl enable elasticsearch.service

现在 Elasticsearch 已经启动并运行了,让我们安装 Kibana。

安装 Kibana

:Logstash 1.4.2 推荐 Kibana 3.0.1。

使用以下命令将 Kibana 下载到您的主目录:

cd ~; curl -O https://download.elasticsearch.org/kibana/kibana/kibana-3.0.1.tar.gz

使用 tar 提取 Kibana 存档:

tar xvf kibana-3.0.1.tar.gz

打开 Kibana 配置文件进行编辑:

vi ~/kibana-3.0.1/config.js

在 Kibana 配置文件中,找到指定 elasticsearch 服务器 URL 的行,并将端口号(默认为 9200)替换为 80

   elasticsearch: "http://"+window.location.hostname+":80",

这是必要的,因为我们计划在端口 80 上访问 Kibana(即 http://logstash_server_public_ip/)。

我们将使用 Apache 来服务我们的 Kibana 安装,所以让我们将文件移动到适当的位置。 使用以下命令创建目录:

sudo mkdir -p /var/www/kibana3

现在将 Kibana 文件复制到新创建的目录中:

sudo cp -R ~/kibana-3.0.1/* /var/www/kibana3/

在我们可以使用 Kibana Web 界面之前,我们必须安装 Apache。 现在让我们这样做。

安装 Apache HTTP

使用 Yum 安装 Apache HTTP:

sudo yum -y install httpd

由于 Kibana 将用户与 Elasticsearch 接口的方式(用户需要能够直接访问 Elasticsearch),我们需要配置 Apache 将端口 80 请求代理到端口 9200(Elasticsearch 默认监听的端口)。 我们将提供一个示例 VirtualHost 文件开始。

下载示例 VirtualHost 配置:

cd ~; wget https://assets.digitalocean.com/articles/logstash/kibana3.conf

打开示例配置文件进行编辑:

vi kibana3.conf

查找 VirtualHostServerName 的突出显示值并将其更改为您的 FQDN(或 localhost,如果您不使用域名)和 root 到我们安装 Kibana 的位置,所以它们看起来像以下条目:

<VirtualHost FQDN:80>
  ServerName FQDN

保存并退出。 现在将其复制到您的 Apache 配置配置中:

sudo cp ~/kibana3.conf /etc/httpd/conf.d/

然后生成将用于访问 Kibana 的登录名(替换您自己的用户名):

sudo htpasswd -c /etc/httpd/conf.d/kibana-htpasswd user

然后输入密码并验证。 刚刚创建的 htpasswd 文件在您最近配置的 Apache 配置中被引用。

现在启动 Apache 以使我们的更改生效:

sudo systemctl start httpd.service

此外,将 Apache 配置为在启动时启动:

sudo systemctl enable httpd.service

Kibana 现在可以通过您的 FQDN 或 Logstash 服务器的公共 IP 地址访问,即 http://logstash_server_public_ip/。 如果您在 Web 浏览器中访问该页面,您应该会看到一个 Kibana 欢迎页面,该页面将允许您查看仪表板,但由于尚未设置 Logstash,因此没有可查看的日志。 现在让我们这样做。

安装 Logstash

Logstash 包与 Elasticsearch 共享相同的 GPG 密钥,我们已经安装了该公钥,所以让我们为 Logstash 创建和编辑一个新的 Yum 存储库文件:

sudo vi /etc/yum.repos.d/logstash.repo

添加以下存储库配置:

[logstash-1.4]
name=logstash repository for 1.4.x packages
baseurl=http://packages.elasticsearch.org/logstash/1.4/centos
gpgcheck=1
gpgkey=http://packages.elasticsearch.org/GPG-KEY-elasticsearch
enabled=1

保存并退出。

使用以下命令安装 Logstash 1.4.2:

sudo yum -y install logstash-1.4.2

Logstash 已安装,但尚未配置。

生成 SSL 证书

由于我们将使用 Logstash Forwarder 将日志从我们的服务器发送到我们的 Logstash 服务器,因此我们需要创建一个 SSL 证书和密钥对。 Logstash Forwarder 使用该证书来验证 Logstash Server 的身份。

现在您有两个选项可用于生成 SSL 证书。 如果您的 DNS 设置允许您的客户端服务器解析 Logstash 服务器的 IP 地址,请使用 选项 2。 否则,选项 1 将允许您使用 IP 地址。

选项 1:IP 地址

如果您没有 DNS 设置——这将允许您收集日志的服务器来解析 Logstash 服务器的 IP 地址——您必须将 Logstash 服务器的私有 IP 地址添加到 [我们将要生成的 SSL 证书的 X217X] (SAN) 字段。 为此,请打开 OpenSSL 配置文件:

sudo vi /etc/pki/tls/openssl.cnf

在文件中找到 [ v3_ca ] 部分,并在其下添加这一行(替换为 Logstash Server 的私有 IP 地址):

subjectAltName = IP: logstash_server_private_ip

保存并退出。

现在使用以下命令在适当的位置 (/etc/pki/tls/) 生成 SSL 证书和私钥:

cd /etc/pki/tls
sudo openssl req -config /etc/pki/tls/openssl.cnf -x509 -days 3650 -batch -nodes -newkey rsa:2048 -keyout private/logstash-forwarder.key -out certs/logstash-forwarder.crt

logstash-forwarder.crt 文件将被复制到将日志发送到 Logstash 的所有服务器,但我们稍后会这样做。 让我们完成我们的 Logstash 配置。 如果您选择此选项,请跳过选项 2 并继续 Configure Logstash

选项 2:FQDN (DNS)

如果您的私有网络设置了 DNS,您应该创建一个包含 Logstash 服务器私有 IP 地址的 A 记录——该域名将在下一个命令中使用,以生成 SSL 证书。 或者,您可以使用指向服务器公共 IP 地址的记录。 只需确保您的服务器(您将从其中收集日志的服务器)能够将域名解析到您的 Logstash 服务器。

现在使用以下命令(替换为 Logstash 服务器的 FQDN)在适当的位置(/etc/pki/tls/...)生成 SSL 证书和私钥:

cd /etc/pki/tls
sudo openssl req -subj '/CN=<^>logstash_server_fqdn/' -x509 -days 3650 -batch -nodes -newkey rsa:2048 -keyout private/logstash-forwarder.key -out certs/logstash-forwarder.crt

logstash-forwarder.crt 文件将被复制到将日志发送到 Logstash 的所有服务器,但我们稍后会这样做。 让我们完成我们的 Logstash 配置。

配置 Logstash

Logstash 配置文件采用 JSON 格式,位于 /etc/logstash/conf.d 中。 配置由三个部分组成:输入、过滤器和输出。

让我们创建一个名为 01-lumberjack-input.conf 的配置文件并设置我们的“lumberjack”输入(Logstash Forwarder 使用的协议):

sudo vi /etc/logstash/conf.d/01-lumberjack-input.conf

插入以下 input 配置:

input {
  lumberjack {
    port => 5000
    type => "logs"
    ssl_certificate => "/etc/pki/tls/certs/logstash-forwarder.crt"
    ssl_key => "/etc/pki/tls/private/logstash-forwarder.key"
  }
}

保存并退出。 这指定了一个 lumberjack 输入,它将侦听 tcp 端口 5000,它将使用我们之前创建的 SSL 证书和私钥。

现在让我们创建一个名为 10-syslog.conf 的配置文件,我们将在其中为 syslog 消息添加一个过滤器:

sudo vi /etc/logstash/conf.d/10-syslog.conf

插入以下 syslog filter 配置:

filter {
  if [type] == "syslog" {
    grok {
      match => { "message" => "%{SYSLOGTIMESTAMP:syslog_timestamp} %{SYSLOGHOST:syslog_hostname} %{DATA:syslog_program}(?:\[%{POSINT:syslog_pid}\])?: %{GREEDYDATA:syslog_message}" }
      add_field => [ "received_at", "%{@timestamp}" ]
      add_field => [ "received_from", "%{host}" ]
    }
    syslog_pri { }
    date {
      match => [ "syslog_timestamp", "MMM  d HH:mm:ss", "MMM dd HH:mm:ss" ]
    }
  }
}

保存并退出。 此过滤器查找标记为“syslog”类型的日志(由 Logstash 转发器),它会尝试使用“grok”来解析传入的 syslog 日志以使其结构化和可查询。

最后,我们将创建一个名为 30-lumberjack-output.conf 的配置文件:

sudo vi /etc/logstash/conf.d/30-lumberjack-output.conf

插入以下 输出 配置:

output {
  elasticsearch { host => localhost }
  stdout { codec => rubydebug }
}

保存并退出。 此输出基本上配置 Logstash 以将日志存储在 Elasticsearch 中。

使用这种配置,Logstash 也会接受与过滤器不匹配的日志,但数据不会被结构化(例如 未过滤的 Nginx 或 Apache 日志将显示为平面消息,而不是按 HTTP 响应代码、源 IP 地址、服务文件等对消息进行分类)。

如果您想为使用 Logstash Forwarder 输入的其他应用程序添加过滤器,请确保为文件命名,以便它们在输入和输出配置之间排序(即 01 到 30 之间)。

重新启动 Logstash 以使我们的配置更改生效:

sudo service logstash restart

现在我们的 Logstash Server 已经准备就绪,让我们开始设置 Logstash Forwarder。

设置 Logstash 转发器

注意:为您希望将日志发送到 Logstash 服务器的每个服务器执行这些步骤。 有关在基于 Debian 的 Linux 发行版上安装 Logstash Forwarder 的说明(例如 Ubuntu、Debian 等),请参阅本教程的 Ubuntu 变体 Build and Package Logstash Forwarder 部分。

复制 SSL 证书和 Logstash 转发器包

Logstash Server 上,将 SSL 证书复制到 Server(替换为您自己的登录名):

scp /etc/pki/tls/certs/logstash-forwarder.crt user@server_private_IP:/tmp

安装 Logstash 转发器包

Server 上,将 Logstash Forwarder RPM 下载到您的主目录:

cd ~; curl -O http://download.elasticsearch.org/logstash-forwarder/packages/logstash-forwarder-0.3.1-1.x86_64.rpm

然后安装 Logstash 转发器包:

sudo rpm -ivh ~/logstash-forwarder-0.3.1-1.x86_64.rpm

接下来,您将要安装 Logstash Forwarder 初始化脚本,以便它在启动时启动。 我们将使用 logstashbook.com 提供的初始化脚本:

cd /etc/init.d/; sudo curl -o logstash-forwarder http://logstashbook.com/code/4/logstash_forwarder_redhat_init
sudo chmod +x logstash-forwarder

初始化脚本依赖于一个名为 /etc/sysconfig/logstash-forwarder 的文件。 一个示例文件可供下载:

sudo curl -o /etc/sysconfig/logstash-forwarder http://logstashbook.com/code/4/logstash_forwarder_redhat_sysconfig

打开它进行编辑:

sudo vi /etc/sysconfig/logstash-forwarder

并修改 LOGSTASH_FORWARDER_OPTIONS 值,使其如下所示:

LOGSTASH_FORWARDER_OPTIONS="-config /etc/logstash-forwarder -spool-size 100"

保存并退出。

现在将 SSL 证书复制到适当的位置 (/etc/pki/tls/certs):

sudo cp /tmp/logstash-forwarder.crt /etc/pki/tls/certs/

配置 Logstash 转发器

Server 上,创建并编辑 JSON 格式的 Logstash Forwarder 配置文件:

sudo vi /etc/logstash-forwarder

现在将以下行添加到文件中,将 logstash_server_private_IP 替换为 Logstash 服务器的私有 IP 地址:

{
  "network": {
    "servers": [ "logstash_server_private_IP:5000" ],
    "timeout": 15,
    "ssl ca": "/etc/pki/tls/certs/logstash-forwarder.crt"
  },
  "files": [
    {
      "paths": [
        "/var/log/messages",
        "/var/log/secure"
       ],
      "fields": { "type": "syslog" }
    }
   ]
}

保存并退出。 这会将 Logstash Forwarder 配置为在端口 5000(我们之前指定输入的端口)上连接到 Logstash 服务器,并使用我们之前创建的 SSL 证书。 paths 部分指定要发送哪些日志文件(这里我们指定 messagessecure),type 部分指定这些日志属于“syslog*”类型(这是我们的过滤器正在寻找的类型)。

请注意,您可以在此处添加更多文件/类型以将 Logstash 转发器配置到其他日志文件到端口 5000 上的 Logstash。

现在我们要使用 chkconfig 添加 Logstash Forwarder 服务:

sudo chkconfig --add logstash-forwarder

现在启动 Logstash Forwarder 以将我们的更改落实到位:

sudo service logstash-forwarder start

现在 Logstash Forwarder 正在向您的 Logstash 服务器发送 messagesauth.log! 对您希望为其收集日志的所有其他服务器重复此过程。

连接到 Kibana

当您在要为其收集日志的所有服务器上设置完 Logstash Forwarder 后,让我们看看 Kibana,我们之前安装的 Web 界面。

在 Web 浏览器中,转到 Logstash 服务器的 FQDN 或公共 IP 地址。 您需要输入您创建的登录名(在 Apache 设置期间),然后您应该会看到 Kibana 欢迎页面。

点击 Logstash Dashboard 进入预制仪表板。 您应该会看到带有日志事件的直方图,以及下面的日志消息(如果您没有看到任何事件或消息,则说明您的四个 Logstash 组件之一配置不正确)。

在这里,您可以搜索和浏览您的日志。 您还可以自定义仪表板。 这是您的 Kibana 实例的示例:

尝试以下操作:

  • 搜索“root”以查看是否有人试图以 root 身份登录您的服务器
  • 搜索特定的主机名
  • 通过选择直方图上的一个区域或从上面的菜单中更改时间范围
  • 单击直方图下方的消息以查看数据是如何被过滤的

Kibana 还有许多其他功能,例如图形和过滤,所以请随意浏览!

结论

现在您的系统日志通过 Logstash 集中,并且您可以使用 Kibana 将它们可视化,您应该从集中所有重要日志开始。 请记住,您几乎可以将任何类型的日志发送到 Logstash,但如果使用 grok 对其进行解析和结构化,数据将变得更加有用。

请注意,任何可以访问您服务器的人都可以访问您的 Kibana 仪表板,因此您需要使用 htaccess 之类的东西来保护它。