什么是 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/ElasticsearchClient: CentOS 7 (IP: 10.28.204.66). 8 GB RAM.
&
Filebeat
先决条件:
由于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的日志是这样:
[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
请问这两个问题如何解决?