Logstash Filebeat 安装配置之使用 Kibana 分析日志数据

什么是 Logstash?

Logstash 是用于管理事件和日志的开源工具。它为数据收集提供实时传递途径。Logstash 将收集你的日志数据,将数据转换为 JSON 文档,并将其存储在 Elasticsearch 中。

本教程的目地是使用Logstash来收集服务器的syslog,并设置Kibana可视化收集的日志。

此次我们需要用到的组件:

Logstash:处理传入日志的的服务器组件
Elasticsearch:存储所有日志。
Kibana:用于搜索和可视化日志的Web界面。
Filebeat:安装在客户端服务器上,利用Filebeat向Logstash搬运日志数据,典型的搬运工。

以上组件都需要用到,确保Elasticsearch、Kibana已经安装好,如未安装,请参阅以下教程:

安装配置 Elasticsearch 搜索引擎集群
ElasticSearch 之 Kibana 二进制安装配置
Elasticsearch Kibana 集群 安装配置 X-pack 扩展包

环境:

Server: CentOS 7 (IP: 10.28.204.65). 16 GB RAM.
&
Logstash/Kibana/Elasticsearch

Client: CentOS 7 (IP: 10.28.204.66). 8 GB RAM.
&
Filebeat

先决条件:

Linux JAVA JDK JRE 环境变量安装与配置

由于Logstash基于Java,请确保您的计算机上安装有OpenJDK或Oracle JDK(暂不支持Java 9)。

安装说明:

ELK 官网对于每种软件提供了多种格式的安装包(zip/tar/rpm/DEB),以 Linux Centos 7 系统为例,如果直接下载 RPM,可以通过 rpm -ivh path_of_your_rpm_file 直接安装成系统 service。以后就可以使用 systemctl 命令启停。比如 systemctl logstash.service start/stop/status。很简单,但缺点也很明显,不能自定义安装目录,相关文件放置比较分散,不易于集中管理。

安装 Logstash

下载地址://www.elastic.co/downloads/logstash

说明:我下面讲述两种安装方式。全程使用超级root用户操作。

二进制压缩包安装方式

1.解压并将其移动到合适的路径:

$ cd /tmp
$ tar zxvf logstash-5.6.3.tar.gz
$ mv logstash-5.6.3 /usr/local
$ cd /usr/local
$ ln -s logstash-5.6.3 logstash
$ mkdir -p /usr/local/logstash/config/conf.d

2.创建用户和组并赋予权限

$ groupadd logstash
$ useradd -g logstash logstash
$ chown -R logstash.logstash logstash*

3.创建systemctl系统单元文件

$ vim /etc/systemd/system/logstash.service

[Unit]
Description=logstash

[Service]
Type=simple
User=logstash
Group=logstash
# Load env vars from /etc/default/ and /etc/sysconfig/ if they exist.
# Prefixing the path with '-' makes it try to load, but if the file doesn't
# exist, it continues onward.
EnvironmentFile=-/usr/local/logstash/config
EnvironmentFile=-/usr/local/logstash/config
ExecStart=/usr/local/logstash/bin/logstash "--path.settings" "/usr/local/logstash/config"
Restart=always
WorkingDirectory=/
Nice=19
LimitNOFILE=16384

[Install]
WantedBy=multi-user.target

安装完成。此种安装方法优势在于配置文件集中,易管理,但安装比较麻烦。

YUM 安装方式

此种安装方式简单快速,耗时较短。

1.下载并安装公共签名密钥:

$ rpm --import //artifacts.elastic.co/GPG-KEY-elasticsearch

如果下载失败,请将服务器DNS修改为 8.8.8.8 重启网卡即可。

2.添加logstash镜像源

$ vim /etc/yum.repos.d/logstash.repo

[logstash-5.x]
name=Elastic repository for 5.x packages
baseurl=//artifacts.elastic.co/packages/5.x/yum
gpgcheck=1
gpgkey=//artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=1
autorefresh=1
type=rpm-md

3.开始安装

$ yum install logstash -y

安装完后会自动生成logstash.service单元文件,无需手动创建。

说明5.x 代表:默认安装最新版的logstash,可根据需求把 x 更改为具体版本号,例如:5.6

YUM安装后的相关配置目录:

/usr/share/logstash - 主程序
/etc/logstash - 配置文件
/var/log/logstash - 日志
/var/lib/logstash - 数据存储

开始配置 Logstash

注意:以下操作,我使用第一种安装方式配置。

Filebeat(Logstash Forwarder)通常安装在客户端服务器上,并使用SSL证书验证Logstash服务器的身份以进行安全通信。

1.生成有效期为365天的自签名SSL证书,使用主机名或IP SAN创建SSL证书。

方法一(主机名):

$ cd /etc/pki/tls/

现在创建SSL证书。将“server.renwolecom.local” 替换为你的logstash服务器主机名。

$ openssl req -x509 -nodes -newkey rsa:2048 -days 365 -keyout private / logstash-forwarder.key -out certs / logstash-forwarder.crt -subj / CN = server.renwolecom.local

2.如果你计划使用IP地址而不是主机名,请按照以下步骤为IP SAN创建SSL证书。

方法二(IP地址):

要创建IP SAN证书,你需要在OpenSSL配置文件中的SubjectAltName中添加一个logstash服务器的IP地址。

$ vim /etc/pki/tls/openssl.cnf

查找 “[v3_ca]” 部分,在此字段下方添加logstash服务器的IP,例如:

subjectAltName = IP:10.28.204.65

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

本文采用后者。

配置 logstash.conf

Logstash配置可以在/etc/logstash(YUN安装方式)中找到。由于我是二进制安装,所以需要在 /usr/local/logstash/config 目录下创建conf.d文件夹(已创建)。

logstash配置文件由三部分组成,分别是:输入、过滤、输出; 你可以在 /usr/local/logstash/config/conf.d 下分别创建三个配置文件,也可以将这三个部分放在一个配置文件中。

1.我建议你使用单个文件并放置输入、过滤、输出部分。

$ vim /usr/local/logstash/config/conf.d/logstash.conf

2.在输入部分,我将配置Logstash通信端口以及添加SSL证书,从而进行安全通信。

input {
 beats {
   port => 5044
   ssl => true
   ssl_certificate => "/etc/pki/tls/certs/logstash-forwarder.crt"
   ssl_key => "/etc/pki/tls/private/logstash-forwarder.key"
  }
}

3.在过滤器部分,我们将使用Grok来解析这些日志,然后将其发送到Elasticsearch。以下grok过滤器将查找“syslog”标记的日志,并尝试解析它们,以生成结构化索引。

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" ]
    }
  }
}

4.在输出部分,我们将定义要存储的日志位置; 这个很显然是Elasticsearch服务器。

output {
 elasticsearch {
  hosts => [ "10.28.204.65:9200" ]
    index => "%{[@metadata][beat]}-%{+YYYY.MM.dd}"
 user => elastic
 password => changeme
       }
stdout {
    codec => rubydebug
       }
}

5.完整配置内容如下:

$ cat /usr/local/logstash/config/conf.d/logstash.conf

input {
 beats {
   port => 5044
   ssl => true
   ssl_certificate => "/etc/pki/tls/certs/logstash-forwarder.crt"
   ssl_key => "/etc/pki/tls/private/logstash-forwarder.key"
  }
}
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" ]
    }
  }
}
output {
 elasticsearch {
  hosts => [ "10.28.204.65:9200" ]
    index => "%{[@metadata][beat]}-%{+YYYY.MM.dd}"
 user => elastic
 password => changeme
       }
stdout {
    codec => rubydebug
       }
}

修改 logstash.yml 主配置文件

修改完成后的内容如下:

$ egrep -v "(^#|^$)" /usr/local/logstash/config/logstash.yml

path.config: /usr/local/logstash/config/conf.d
path.logs: /usr/local/logstash/logs

主要是上面路径。

启动 logstash 并加入开机自启

$ systemctl start logstash
$ systemctl enable logstash

启动后你可以通过如下命令查看日志状态,从而解决任何可能出现的问题。

YUM安装查看日志:

$ cat /var/log/logstash/logstash-plain.log

二进制安装查看日志:

$ cat /usr/local/logstash/logs/logstash-plain.log

请根据自己的实际路径查看操作。

在客户端服务器上安装 Filebeat

1.有5个Beats客户端可用,分别是:

Filebeat – 实时洞察日志数据。
Packetbeat – 分析网络数据包数据。
Metricbeat – 采集服务的各项性能指标。
Winlogbeat – 轻量级的Windows事件日志。
Heartbeat – 主动探测来监控其可用性的服务。

2.要分析客户端计算机的系统日志(例如:10.28.204.66),我们需要安装filebeat。使用以下命令进行安装:

$ curl -L -O //artifacts.elastic.co/downloads/beats/filebeat/filebeat-5.6.3-x86_64.rpm
$ rpm -vi filebeat-5.6.3-x86_64.rpm

配置 Filebeat

现在是时候将filebeat与Logstash连接起来,按照下面的步骤来获得配置ELK Stack的filebeat。

1.Filebeat(beats)使用SSL证书验证logstash服务器身份,因此将logstash-forwarder.crt从logstash服务器复制到客户端。

$ scp -pr root@10.28.204.65:/etc/pki/tls/certs/logstash-forwarder.crt /etc/ssl/certs/

2.打开filebeat配置文件

$ vim /etc/filebeat/filebeat.yml

3.我们将配置filebeat来发送 /var/log/messages 日志内容到Logstash服务器。因此请在路径部分下修改现有的配置。请注释掉– /var/log/*.log,以避免将该目录中所有.log文件发送到Logstash。

...
paths:

- /var/log/messages
# - /var/log/*.log
...

4.注释掉“output.elasticsearch”部分。因为我们不会直接将日志存储到Elasticsearch

...
#output.elasticsearch:
...

5.现在,找到 “output.logstash” 行。并修改如下所示的内容:

本节定义filebeat将日志发送到logstash服务器“10.28.204.65:5044”。并修改SSL证书所在的路径。

...
output.logstash:
  # The Logstash hosts
  #hosts: ["localhost:5044"]
  hosts: ["103.28.204.65:5044"]

  # Optional SSL. By default is off.
  # List of root certificates for HTTPS server verifications
  ssl.certificate_authorities: ["/etc/ssl/certs/logstash-forwarder.crt"]
...

保存并退出。
重要:Filebeat的配置文件采用YAML格式,这意味着缩进非常重要!请务必使用与这些说明相同数量的空格。

重新启动 Filebeat 服务

$ systemctl restart filebeat
$ cat /var/log/filebeat/filebeat

Firewall 防火墙设置

$ firewall-cmd --permanent --zone=public --add-port=5044/tcp
$ firewall-cmd --reload

测试数据是否正常存储

在你的 Elasticsearch 服务器上,通过使用以下命令,验证 Elasticsearch 是否接收到 Filebeat>logstash 数据:

$ curl -u elastic -XGET '//10.28.204.65:9200/filebeat-*/_search?pretty'

回车后输入你的认证密码,你应该看到一堆如下的输出:

...
{
"_index" : "filebeat-2017.11.1",
"_type" : "log",
"_id" : "AV8Zh29HaTuC0RmgtzyM",
"_score" : 1.0,
"_source" : {
"@timestamp" : "2017-11-1T06:16:34.719Z",
"offset" : 39467692,
"@version" : "1",
"beat" : {
"name" : "204",
"hostname" : "204",
"version" : "5.6.3"
},
"input_type" : "log",
"host" : "204",
"source" : "/var/log/messages",
"message" : "Nov 11 19:06:37 204 logstash: at org.jruby.internal.runtime.methods.InterpretedMethod.call(InterpretedMethod.java:182)",
"type" : "log",
"tags" : [
"beats_input_codec_plain_applied"
]
}
...

如果你的输出显示为 0,那么你应该排查logstash与Elasticsearch的通信是否正常,通过可以通过查看启动日志得出结论。如果你获得了预期的输出,则进行下一步。

连接到 Kibana

1.使用以下URL访问Kibana:

//10.28.204.65:5601/

2.在你的第一次登录时,你必须映射filebeat索引。

在索引名称或模式框中键入以下内容:

filebeat-*

选择 @timestamp 然后单击创建。

3.还可以登录 logstash
依次打开:

Management >> Index Patterns >> Create Index Pattern

输入:

filebeat-*

选择:

@timestamp

其他默认,点击:Create

4.创建完成后点击:

Discover >> filebeat-*

此时你可以在右侧查看客户端 10.28.204.66 的系统日志。

ELK Stack Logstash 的安装配置与结合使用到目前为止已经完成,Kibana不仅仅局限于此,他还有更强大的功能,值得深入研究。

Logstash Filebeat 安装配置之使用 Kibana 分析日志数据》有3个想法

  1. 苏幕遮

    博主,你好!

    我的logstash的日志是这样:
    [2017-12-06T22:10:04,117][INFO ][org.logstash.beats.BeatsHandler] Exception: not an SSL/TLS record: 325700000001324300000130785e6c90cb8adb401045e53f696aad6eb5645b921b02de38c1812410b24a08a1249564413f443f1c07e31fc8570f6260c030bba25ef79e5b7dceb26c93659bff77381a8a386044507788ff160205da4d9043471841c1386bea08233cf2e7f96c9714ff3c9d180a01a7f54525cb869715973b561ed46eafa4ccdbf6c0ce5f3f7e638cb3de1931e025a1e89d31ce0a831627f262368b16df699a9dfd821627f267b3e85f038d98743c5dc9c6d38dfa149dffe45d5af88e1f7e33ce3c4db3b36cf4ceb0a1631f984d5a430e1dad1477b8b8102d9ad5db986ccf31f55cca1272b8920fb3b3a0602f6ab176dedb7be4708cb3a110d12ca0e00db0fe211b55b6aa6ac4566e7f420ec125dfaf4285b1b1b884bfb702535f683785b510aff1ba710c1441d5f5be69ebc74b000000ffff882d7cd7, from: /10.117.32.243:42210

    我的filebeat的日志是这样:
    2017-12-06T21:35:03+08:00 ERR Failed to publish events caused by: read tcp 10.117.32.243:41787->10.162.80.171:5044: read: connection reset by peer
    2017-12-06T21:35:03+08:00 INFO Error publishing events (retrying): read tcp 10.117.32.243:41787->10.162.80.171:5044: read: connection reset by peer
    2017-12-06T21:35:27+08:00 INFO Non-zero metrics in the last 30s: libbeat.logstash.call_count.PublishEvents=1 libbeat.logstash.publish.read_errors=1 libbeat.logstash.publish.write_bytes=316 libbeat.logstash.published_but_not_acked_events=2035

    请问这两个问题如何解决?

    回复

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

Captcha Code