提供:ZStack云计算
系列教程
本教程为在Ubuntu 14.04上利用ELK堆栈(Elasticsearch、Logstash与Kibana)实现集中化日志记录系列五篇中的第一篇。
内容简介
在本教程中,我们将了解如何在Ubuntu 14.04上安装ELK堆栈,即Elasticsearch 2.2.x、Logstash 2.2.x以及Kibana 4.4.x。我们还将探讨如何利用Filebeat 1.1.x以集中化方式对其进行配置以实现系统日志整理与可视化转换。Logstash是一款用于日志收集、解析与存储的开源工具,Kibana则可负责为Logstash所索引的日志提供搜索与查看Web界面。这两款工具皆基于Elasticsearch运行,并依赖于其完成日志存储。
集中化日志记录能够帮助大家发现服务器或应用中的问题,并允许大家确定特定时间段内的日志以关联跨越多台服务器的故障现象。
Logstash可用于收集各类日志类型,但在本教程中,我们将只讨论系统日志方向。
既定目标
本教程的目标在于设置Logstash以收集多台服务器上的系统日志,而后设置Kiabana对收集到的日志进行可视化处理。
我们要用到的主要ELK堆栈组件包括:
- Logstash: 用于处理输入日志的Logstash服务器组件
- Elasticsearch: 存储全部日志信息
- Kibana: 用于搜索及可视化处理日志的Web界面,其将通过Nginx进行代理
- Filebeat: 安装在客户服务器上并将其日志发送至Logstash,Filebeat将利用lumberjack协议与Logstash进行通信
我们将把前三种组件安装在单一服务器上,其将成为我们的ELK服务器。Filebeat则需要安装在全部服务器上,它们将成为我们的客户服务器。
先决条件
要完成本教程,大家首先需要引导一套Ubuntu 14.04 VPS。相关方法请参阅利用Ubuntu 14.04进行初始服务器设置。
如果大家倾向于使用CentOS,请参阅如何在CentOS 7上安装ELK。
ELK服务器的CPU、内存与存储要求取决于大家需要收集的日志信息量。在本示例中,我们将使用以下规格VPS作为ELK服务器:
- 操作系统: Ubuntu 14.04
- 内存: 4GB
- CPU: 2
除了ELK服务器外,大家还需要设置其它服务器作为日志收集目标。
下面开始设置ELK服务器!
安装Java 8
Elasticsearch与Logstash需要Java作为运行环境,因此我们在这里进行安装。我们选择安装最新的甲骨文Java 8版本以符合Elasticsearch推荐要求。不过其应该也能够与OpenJDK顺畅协作,总之大家随意选择即可。
将甲骨文Java PPA添加至apt:
- sudo add-apt-repository -y ppa:webupd8team/java
更新apt软件包数据库:
- sudo apt-get update
安装甲骨文Java 8的最新稳定版本,命令如下(在弹出的许可协议中点击接受):
- sudo apt-get -y install oracle-java8-installer
现在Java 8安装完成,让我们继续推进。
安装Elasticsearch
我们可通过添加Elastic的软件包源列表利用软件包管理器安装Elasticsearch。
运行以下命令以将Elasticsearch公共GPG密钥导入apt:
- wget -qO - https://packages.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -
如果大家的提示符停止在这里,则可能需要我们输入用户密码(以验证sudo命令)。
接下来,创建Elasticsearch源列表:
- echo "deb http://packages.elastic.co/elasticsearch/2.x/debian stable main" | sudo tee -a /etc/apt/sources.list.d/elasticsearch-2.x.list
更新我们的apt软件包数据库:
- sudo apt-get update
利用以下命令安装Elasticsearch:
- sudo apt-get -y install elasticsearch
Elasticsearch已经安装完成。下面编辑其配置文件:
- sudo vi /etc/elasticsearch/elasticsearch.yml
大家可以需要限制来自外部的Elasticsearch实例访问活动(端口9200),这样可以保证外来人士无法通过HTTP API读取数据或者关闭Elasticsearch集群。找到指定network.host的一行,取消其注释并将其值替换为“localhost”:
elasticsearch.yml excerpt (updated)
network.host: localhost
保存并退出elasticsearch.yml。
现在启动Elasticsearch:
- sudo service elasticsearch restart
运行以下命令以在引导中启动Elasticsearch:
- sudo update-rc.d elasticsearch defaults 95 10
现在Elasticsearch已经启动并运行。接下来安装Kibana。
安装Kibana
我们可添加Elastic软件包源列表以安装Kibana。
创建Kibana源列表:
- echo "deb http://packages.elastic.co/kibana/4.4/debian stable main" | sudo tee -a /etc/apt/sources.list.d/kibana-4.4.x.list
更新apt软件包数据库:
- sudo apt-get update
利用以下命令安装Kibana:
- sudo apt-get -y install kibana
Kibana现在安装完成。
打开Kibana配置文件:
- sudo vi /opt/kibana/config/kibana.yml
在此文件中,找到server.host一行,并将其IP地址(默认为“0.0.0.0”)替换为“localhost”:
kibana.yml excerpt (updated)
server.host: "localhost"
保存并退出。此设置会确保Kibana只接受来自本地主机的访问。放心,后面我们将利用Nginx反向代理实现外部访问。
现在启动Kibana服务:
- sudo update-rc.d kibana defaults 96 9
- sudo service kibana start
在使用Kibana Web界面之前,我们还需要设置一套反向代理。在本示例中,我们利用Nginx加以实现。
安装Nginx
由于我们在配置中要求Kibana监听本地主机,因此必须设置反向代理以允许外部接入。我们将使用Nginx完成这项目标。
请注意:如果大家已经拥有合适的Nginx实例,请直接使用。当然,必须确保对Kibana进行配置以保证其能够接受来自Nginx服务器的接入请求(需要将/opt/kibana/config/kibana.yml中的hostvalue添加为Kibana服务器的专有IP地址或者主机名称)。另外,这里也建议大家启用SSL/TLS。
使用apt以安装Nginx与Apache2-utils:
- sudo apt-get install nginx apache2-utils
使用htpasswd以创建一个名为“kibanaadmin”的管理员用户(当然也可以使用其它名称),用于访问Kibana Web界面:
- sudo htpasswd -c /etc/nginx/htpasswd.users kibanaadmin
根据提示输入一条密码。请记住这一登录凭证,我们需要用它访问Kibana Web界面。
现在打开Nginx默认文件中的服务器部分:
- sudo vi /etc/nginx/sites-available/default
删除文件内容,将以下代码片段复制进去。请确保将server_name部分替换为大家的实际服务器名称:
/etc/nginx/sites-available/default
- server {
- listen 80;
- server_name example.com;
- auth_basic "Restricted Access";
- auth_basic_user_file /etc/nginx/htpasswd.users;
- location / {
- proxy_pass http://localhost:5601;
- proxy_http_version 1.1;
- proxy_set_header Upgrade $http_upgrade;
- proxy_set_header Connection 'upgrade';
- proxy_set_header Host $host;
- proxy_cache_bypass $http_upgrade;
- }
- }
保存并退出。现在Nginx将把指向服务器的HTTP流量定向至Kibana应用,而后者则持续监听localhost:5601。另外,Nginx还将使用htpasswd.users文件,从而要求访问者提供验证凭证。
现在重启Nginx以应用变更:
- sudo service nginx restart
Kibana现在可通过FQDN或者ELK服务器的公共IP地址实现访问。如果大家通过浏览器进行访问,则在输入“kibanaadmin”凭证后就座地看到Kibana欢迎页面,并要求我们配置一套目录模式。这部分内容我们稍后再行讲解。
安装Logstash
Logstash软件包与Elasticsearch位于同一库中,由于我们已经安装了公共密钥,因此下面直接创建Logstash源列表:
- echo 'deb http://packages.elastic.co/logstash/2.2/debian stable main' | sudo tee /etc/apt/sources.list.d/logstash-2.2.x.list
更新apt软件包数据库:
- sudo apt-get update
安装Logstash:
- sudo apt-get install logstash
下面需要对Logstash进行配置。
生成SSL证书
由于我们需要使用Filebeat将来自客户服务器的日志发送至ELK服务器,因此这里必须创建一份SSL证书与密钥对。该证书由Filebeat用于验证ELK服务器身份。下面创建存储证书与私钥的目录:
- sudo mkdir -p /etc/pki/tls/certs
- sudo mkdir /etc/pki/tls/private
现在我们可以选择两种方式生成SSL证书。如果大家的DNS设置允许客户服务器解析ELK服务器的IP地址,则选择选项二。如若不然,请选择选项一。
选项一:IP地址
如果大家还没有设置DNS来解析ELK服务器的IP地址,那么可直接将ELK服务器的专有IP地址添加至SSL证书的subjectAltName(简称SAN)字段当中。首先打开OpenSSL配置文件:
- sudo vi /etc/ssl/openssl.cnf
找到文件中的[ v3_ca ]区段,在末尾添加以下行(注意替换实际ELK服务器专有IP地址):
openssl.cnf excerpt (updated)
subjectAltName = IP: ELK_server_private_IP
保存并退出。
现在在对应位置(/etc/pki/tls/)生成SSL证书与私钥:
- cd /etc/pki/tls
- sudo openssl req -config /etc/ssl/openssl.cnf -x509 -days 3650 -batch -nodes -newkey rsa:2048 -keyout private/logstash-forwarder.key -out certs/logstash-forwarder.crt
其中的logstash-forwarder.crt文件将被复制至全部需要向Logstash发送日志的服务器,这部分工作我们稍后再进行。如果选择了选项一,大家可以直接跳过选项二。
选项二:FQDN(DNS)
如果大家已经在专有网络中设置了DNS,则可创建一条A记录以包含ELK服务器的专有IP地址。其中的域名将在下一条命令中用于生成SSL证书。另外,大家也可以使用一条记录以指向该服务器的公共IP地址。请确保大家的服务器(即生成日志的目标服务器)能够解析ELK服务器的域名。
现在生成SSL证书与私钥,命令如下(将ELK服务器FQDN替换为实际值):
- cd /etc/pki/tls; sudo openssl req -subj '/CN=ELK_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配置文件为JSON格式,且位于/etc/logstash/conf.d当中。其配置由三部分构成:input、filter与output。
下面首先创建一个名为02-beats-input.conf的配置文件,并设置我们的“filebeat” input:
- sudo vi /etc/logstash/conf.d/02-beats-input.conf
插入以下input配置:
02-beats-input.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"
- }
- }
保存并退出。此文件负责指定在tcp端口5044上监听beats input,同时使用我们之前创建的SSL证书与私钥。
现在我们创建名为10-syslog-filter.conf的配置文件,并向其中添加系统日志信息filter:
- sudo vi /etc/logstash/conf.d/10-syslog-filter.conf
向其中插入以下系统日志过滤配置:
10-syslog-filter.conf
- 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" ]
- }
- }
- }
保存并退出。此filter将搜索属于“syslog”类型标签的日志,并尝试使用grok解析输入的系统日志以保证其结构化与可查询性。
最后,创建一个名为30-elasticsearch-output.conf的配置文件:
- sudo vi /etc/logstash/conf.d/30-elasticsearch-output.conf
插入以下output配置:
/etc/logstash/conf.d/30-elasticsearch-output.conf
- output {
- elasticsearch {
- hosts => ["localhost:9200"]
- sniffing => true
- manage_template => false
- index => "%{[@metadata][beat]}-%{+YYYY.MM.dd}"
- document_type => "%{[@metadata][type]}"
- }
- }
保存并退出。此output负责配置Logstash将beats数据存储在运行在localhost:9200上的Elasticsearch当中,同时生成供之后使用的目录名称(在本示例中,名称为filebeat)。
如果大家希望为同时使用Filebeat input的其它应用添加filter,请确保命名相关文件以对input与output配置者排序(即在02-与30-之间)。
下面测试这套Logstash配置:
- sudo service logstash configtest
如果没有语法错误,系统将显示Configuration OK字样。否则,尝试查阅错误信息以了解Logstash配置失误。
重启Logstash以应用上述变更:
- sudo service logstash restart
- sudo update-rc.d logstash defaults 96 9
接下来,我们将载入示例Kibana仪表板。
加载Kibana仪表板
Elastic提供多套示例Kibana仪表板与Beats索引模式。虽然我们在本示例中不会使用仪表板,但仍会加载一套以使用其中提供的Filebeat索引模式。
首先,下载示例仪表板归档文件至主目录:
- cd ~
- curl -L -O https://download.elastic.co/beats/dashboards/beats-dashboards-1.1.0.zip
安装该解压缩软件包:
- sudo apt-get -y install unzip
接下来提取归档文件内容:
- unzip beats-dashboards-*.zip
而后将示例仪表板、可视化方案与Beats目录模式加载至Elasticsearch:
- cd beats-dashboards-*
- ./load.sh
以下为我们刚刚加载的索引模式:
- [packetbeat-]YYYY.MM.DD
- [topbeat-]YYYY.MM.DD
- [filebeat-]YYYY.MM.DD
- [winlogbeat-]YYYY.MM.DD
在使用Kibana时,我们将选择Filebeat作为默认索引模式。
在Elasticsearch中加载Filebeat目录模板
由于需要利用Filebeat向Elasticsearch发送日志,因此我们应当加载一套Filebeat目录模板。该目录模板将配置Elasticsearch以智能分析输入的Filebeat字段。
首先,将Filebeat目录模板下载至主目录:
- cd ~
- curl -O https://gist.githubusercontent.com/thisismitch/3429023e8438cc25b86c/raw/d8c479e2a1adcea8b1fe86570e42abab0f10f364/filebeat-index-template.json
而后加载该模板:
- curl -XPUT 'http://localhost:9200/_template/filebeat?pretty' -d@filebeat-index-template.json
如果模板加载正确,则显示信息如下:
Output:
{
"acknowledged" : true
}
现在我们的ELK服务器已经可以接收Filebeat数据了,接下来在每台客户服务器上设置Filebeat。
设置Filebeat (添加客户服务器)
通过以下步骤保证各Ubuntu或Debian服务器向ELK服务器上的Logstash发送日志。如果大家打算在红帽Linux发行版上安装Filebeat,请参阅CentOS版本的设置Filebeat (添加客户服务器)部分。
复制SSL证书
在ELK服务器上将SSL证书复制至客户服务器(替换其中的客户服务器地址与登录凭证):
- scp /etc/pki/tls/certs/logstash-forwarder.crt user@client_server_private_address:/tmp
现在在客户服务器上将ELK服务器的SSL证书复制到正确位置(/etc/pki/tls/certs):
- sudo mkdir -p /etc/pki/tls/certs
- sudo cp /tmp/logstash-forwarder.crt /etc/pki/tls/certs/
现在我们开始安装Filebeat软件包。
安装Filebeat软件包
在客户服务器上创建Beats源列表:
- echo "deb https://packages.elastic.co/beats/apt stable main" | sudo tee -a /etc/apt/sources.list.d/beats.list
其与Elasticsearch使用同样的GPG密钥,可利用以下命令进行安装:
- wget -qO - https://packages.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -
而后安装Filebeat软件包:
- sudo apt-get update
- sudo apt-get install filebeat
接下来对Filebeat进行配置。
配置Filebeat
接下来配置Filebeat以接入ELK服务器上的Logstash。文件的具体内容可参阅这里。
在客户服务器上,创建一个Filebeat配置文件:
- sudo vi /etc/filebeat/filebeat.yml
注意:Filebeat配置文件为YAML格式,这意味着需要注意缩进!确保在命令中使用同样的空格数量。
在文件开头,大家会看到prospectors部分,在这里大家可以通过定义prospectors以指定日志文件发送方式及处理方式。每个prospector都由- character进行注明。
我们将修改现有prospector以将syslog与auth.log发送至Logstash。在路径中对- /var/log/*.log文件进行注释操作。如此一来,Filebeat就不会将每个目录中的.log文件都发送至Logstash。而后添加新的syslog与auth.log条目。完成后内容如下:
filebeat.yml excerpt 1 of 5
...
paths:
- /var/log/auth.log - /var/log/syslog# - /var/log/*.log
...
接下来找到指定document_type:的行,取消其注释并将值变更为“syslog”。修改后内容如下:
filebeat.yml excerpt 2 of 5
...
document_type: syslog
...
这部分内容指定prospector中的日志皆为syslog类型(即我们的Logstash filter所查找的类型)。
如果大家希望将其它文件发送至ELK服务器,或者需要变更Filebeat对日志的处理方式,请随意修改或者添加其它prospector条目。
下面在output部分找到包含elasticsearch:的行,其代表Elasticsearch的output部分(在本示例中用不到)。删除或者进行注释操作(直到#logstash:处)。
找到作为注释存在的Logstash output部分,即包含#logstash:的行,删除#以取消其注释。另外,在此部分中取消hosts: [“localhost:5044”]一行的注释。将localhost变更为ELK服务器的专有IP地址(或者主机名称):
filebeat.yml excerpt 3 of 5
### Logstash as output
logstash:
# The Logstash hosts
hosts: ["ELK_server_private_IP:5044"]
这部分内容负责配置Filebeat以通过端口5044接入ELK服务器上的Logstash(我们此前将此端口指定为Logstash input)。
在hosts条目下添加以下行:
filebeat.yml excerpt 4 of 5
bulk_max_size: 1024
下面找到tls部分并取消其注释。而后取消指定certificate_authorities一行的注释,将其值变更为[“/etc/pki/tls/certs/logstash-forwarder.crt”]。内容如下:
filebeat.yml excerpt 5 of 5
...
tls:
# List of root certificates for HTTPS server verifications
certificate_authorities: ["/etc/pki/tls/certs/logstash-forwarder.crt"]
其将配置Filebeat以使用我们在ELK服务器上创建的SSL证书。
保存并退出。
现在重启Filebeat以应用变更:
- sudo service filebeat restart
- sudo update-rc.d filebeat defaults 95 10
再次强调,如果大家不确定自己的Filebeat配置是否正确,请将其与Filebeat配置示例进行比较。
现在Filebeat会将syslog与auth.log发送至ELK服务器上的Logstash了!在其它服务器上重复上述步骤。
测试Filebeat安装
如果大家的ELK堆栈已经设置正确,Filebeat(在客户服务器上)应当会将日志发送至ELK服务器上的Logstash。Logstash则将Filebeat数据加载至Elasticsearch内包含日期戳的目录filebeat-YYYY.MM.DD当中。
在ELK服务器上,我们可以查询Filebeat目录以验证Elasticsearch是否切实接收到数据:
- curl -XGET 'http://localhost:9200/filebeat-*/_search?pretty'
大家看到的输出结果应如下所示:
Sample Output:
...
{
"_index" : "filebeat-2016.01.29",
"_type" : "log",
"_id" : "AVKO98yuaHvsHQLa53HE",
"_score" : 1.0,
"_source":{"message":"Feb 3 14:34:00 rails sshd[963]: Server listening on :: port 22.","@version":"1","@timestamp":"2016-01-29T19:59:09.145Z","beat":{"hostname":"topbeat-u-03","name":"topbeat-u-03"},"count":1,"fields":null,"input_type":"log","offset":70,"source":"/var/log/auth.log","type":"log","host":"topbeat-u-03"}
}
...
如果输出结果为空白,则意味着Elasticsearch并未加载任何正在搜索的目录内的日志,那么设置一定是出了问题。若一切正常,则推进至下一步。
接入Kibana
下面说回我们之前安装完成的Web界面Kibana。
在浏览器中访问ELK服务器的FQDN或者公共IP地址。在输入“kibanaadmin”凭证后,应该会看到以下页面,要求我们配置一套默认索引模式:
在左侧的Index Patterns菜单中选择[filebeat]-YYY.MM.DD,而后点击Star(设为默认模式)按钮。
现在点击顶部导航栏中的Discover链接。在默认情况下,其将显示过去15分钟内的全部日志数据。这时大家会查看到日志事件的历史图表,其中包含日志信息:
在这里,大家可以搜索并浏览日志内容,并定制自己的仪表板。
各位不妨尝试以下操作:
- 搜索“root”以查看是否有人尝试以root身份登录服务器
- 搜索特定主机名称(即搜索host: “hostname”)
- 通过历史图表或者顶部菜单变更选定的时间段
- 点击历史图表下方的信息以查看数据过滤方式
Kibana还拥有众多其它功能,包括图形化与过滤,请大家任意尝试!
总结
现在大家的系统日志已经以集中方式通过Elasticsearch与Logstash实现收集与管理,而Kibana则负责进行图形化处理。请记住,我们可以使用多种日志类型或者数据索引模式,但经过grok解析的结构化信息无疑更具实用性。
要进一步改善这套ELK堆栈,大家可以通过Logstash收集并过滤其它日志并参阅如何创建Kibana仪表板. You may also want to gather system metrics by using Topbeat一文。相关议题我们将在本系列的其它文章中逐一探讨。
祝大家好运!
本文来源自DigitalOcean Community。英文原文:How To Install Elasticsearch, Logstash, and Kibana (ELK Stack) on Ubuntu 14.04 By Mitchell Anicas
翻译:diradw