共计 21967 个字符,预计需要花费 55 分钟才能阅读完成。
前言:
在这个教程中, 将会全面介绍怎么在 Ubuntu 14.04上安装 Elasticsearch ELK Stack,也就是Elasticsearch 2.2.x, Logstash 2.2.x, 以及 Kibana 4.4.x。当然,这里也会涉及在一个集中点中怎么配置 Filebeat1.1x 来收集和可视化的系统日志的教程。Logstash 是收集、分析和存储日志以供日后使用的开源工具。Kibana 是一个 Web 界面,可用于搜索和查看 Logstash 已索引的日志。这两个工具都基于用于存储日志的 Elasticsearch。
在你试图找出服务器或应用程序问题时,集中化日志是非常有用的,因为它可以让你在一个地方搜索所有的日志。在确定跨多个服务器的问题这一点也非常有用,因为它在一个特定的时间范围内收集多个服务器的日志。
用 Logstash 可以收集很多类型的日志,但是在这个教程中我们限定范围为 syslog。
使用 Elasticsearch + Logstash + Kibana 搭建日志集中分析平台实践 http://www.linuxidc.com/Linux/2015-12/126587.htm
Linux 上安装部署 ElasticSearch 全程记录 http://www.linuxidc.com/Linux/2015-09/123241.htm
Elasticsearch 安装使用教程 http://www.linuxidc.com/Linux/2015-02/113615.htm
ElasticSearch 配置文件译文解析 http://www.linuxidc.com/Linux/2015-02/114244.htm
ElasticSearch 集群搭建实例 http://www.linuxidc.com/Linux/2015-02/114243.htm
分布式搜索 ElasticSearch 单机与服务器环境搭建 http://www.linuxidc.com/Linux/2012-05/60787.htm
ElasticSearch 的工作机制 http://www.linuxidc.com/Linux/2014-11/109922.htm
我们的目的:
这篇教程的目的是安装 Logstash 来收集多个 server 的 syslog,然后安装 Kibana 来可视化收集到的日志。
ELK stack 的安装有 4 个主要的组件:
Logstash:在 server 端,处理传入的日志。
Elasticsearch:存储所有的日志。
Kibana:Web界面,用来搜索和可视化日志;使用 Nginx 代理实现。
Filebeat:安装在 client 端(也就是你需要收集日志的目标服务器),将日志发送给 Logstash。Filebeat 端作为一个日志传送代理,使用的是 lumberjack 网络协议与 Logstash 通信。
我们先安装前三个组件,它们需要安装在同一个 server 上,这个 server 就是我们的 ELKServer。Filebeat 会安装在所有我们想要收集 log 的客户端,统称为 Client Servers。
安装前:
要完成这个教程,需要 Ubuntu 14.04 VPS 的 root 权限。配置的教程可以在这里找到:Initial Server Setup with Ubuntu 14.04
如果你想用 CentOS,看这个教程:How To Install Elasticsearch, Logstash, and Kibana (ELK Stack) on CentOS
ELK Server 的 CPU、RAM 和存储量的需求取决于你将要收集的 log 的数量。在这个教程中,我们将使用以下规格的一个 VPS 作为我们 ELK Server:
OS:Ubuntu 14.04
RAM:4GB
CPU:2
除了 ELK Server,你需要有其他的 Servers 作为日志来源。
现在开始配置 ELK 服务端。
安装 Java 8:
Elasticsearch 和 Logstash 需要 Java,所以我们需要安装。Elasticsearch 需要安装最新的 Oracle Java 8。当然,如果你要用 OpenJDK 的话,应该也不错。
添加 Oracle JavaPPA 到 apt:
1 | sudo add-apt-repository -y ppa:webupd8team /java |
更新 apt 包数据库:
1 | sudo apt-get update |
安装稳定版 Oracle Java8(接受弹出的协议内容):
1 | sudo apt-get -y install oracle-java8-installer |
Java 8 安装好了,接下来安装 Elasticsearch
安装 Elasticsearch:
Elasticsearch 可以用包管理器通过添加 Elastic 的包源列表进行安装。
用下面的命令来导入 Elasticsearch 公共 GPG 密钥到 apt:
1 | wget -qO - https: //packages .elastic.co /GPG-KEY-elasticsearch | sudo apt-key add - |
如果你的终端提示停在这里不动了,可能是在等你输入用户密码(为了授权 sudo 命令)。
创建 Elasticsearch 资源列表:
1 | 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 包数据库并安装 elasticsearch:
1 2 | sudo apt-get update sudo apt-get -y install elasticsearch |
安装好了,接下来编辑配置文档:
1 | sudo vi /etc/elasticsearch/elasticsearch .yml |
要限制你的 Elasticsearch 接口(端口 9200)外的访问,这样外人无法通过 HTTP API 读取数据或关闭您的 Elasticsearch 集群。找到 network.host,取消注释,用 localhost 替换它的值:
1 | network.host: localhost |
保存并退出 elasticsearch.yml。
现在,打开 Elasticsearch:
1 | sudo service elasticsearch restart |
然后运行以下命令将在系统启动时启动 Elasticsearch:
1 | sudo update-rc.d elasticsearch defaults 95 10 |
现在 Elaticsearch 设置好也启动了,现在来安装 Kibana。
安装 Kibana:
Kibana 可以用包管理器通过添加 Elastic 的包源列表进行安装。
创建 Kibana 资源列表:
1 | 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 包数据源并安装:
1 2 | sudo apt-get update sudo apt-get -y install kibana |
这样就安装好了。
打开 Kibana 配置文件编辑:
1 | sudo vi /opt/kibana/config/kibana .yml |
在文件中找到 server.host,用 localhost 替换 0.0.0.0:
1 | server.host: "localhost" |
保存,退出。这个操作让 Kibana 只能被 localhost访问。不要担心,我们会用 Nginx反向代理来允许外部访问。
现在启用 Kibana 服务:
1 2 | sudo update-rc.d kibana defaults 96 9 sudo service kibana start |
在使用 Kibana Web 界面的之前,我们必须安装反向代理。接下来就来安装 Ngnix 吧!(著:如果不用反向代理的话,上一步是不需要把 server.host 改为 localhost,直接访问该主机的 5601 端口即可)
安装 Ngnix:
因为我们配置了 Kibana 监听 localhost,我们必须安装反向代理来允许外部访问。这里就使用 Ngnix 来达成这个目的。
注意:如果你已经有要用的 Ngnix 实例,那就直接使用。只要记得去配置 Kibana,让 Ngnix server 可以访问(你可能需要在 /opt/kibana/config/kibana.yml 改变 host 的值为你的 Kibana server 的 private IP 或者 hostname)。此外,建议您启用 SSL / TLS。
用 apt 安装 Ngnix 和 Apache2-utils:
1 | sudo apt-get install nginx apache2-utils |
用 htpasswd 命令 创建一个 admin 用户,叫 Kibanaadmin(根据自己喜好命名),用来访问 Kibana Web 界面:
1 | sudo htpasswd -c /etc/nginx/htpasswd . users kibanaadmin |
在命令提示终端输入密码。记住用户名和密码,稍候你需要用它来访问 Kibana Web 界面。
现在用你喜欢的编辑器打开 Nginx 的默认服务器模块。我们将用 vi:
1 | sudo vi /etc/nginx/sites-available/default |
删除文件中的内容,复制下面的代码块到文件中。请确保 server_name 和你的 server_name 匹配:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | # cat /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 的配置通过监听 localhost:5601,让你的服务器的 HTTP 流量直接到 Kibana 应用程序。此外,Nginx 的将使用我们前面创建的 htpasswd.users 文件,也会要求基本身份验证。
现在重启 Nginx 让之前的改变生效:
1 | sudo service nginx restart |
Kibana 现在是可访问的,通过 FQDN 也就是你的 ELKServer 公共 IP 地址。http://elk_server_public_ip/ 如果你在浏览器中访问这个地址,然后输入“kibanaadmin”验证。这样,你就可以看到 Kibana 的欢迎界面,在这里它会要求你配置 index 类型。不要管那么多拉,我们待会再来研究,先回去安装其他组件。
安装 Logstash:
Logstash 软件包和 Elasticsearch 的在同一个版本库,之前我们已经添加了这个公共密钥。所以,直接创建 Lostash 的资源列表:
1 | 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 包数据源并安装:
1 2 | sudo apt-get update sudo apt-get install logstash |
安装好了!但是还没有配置。
生成 SSL 证书:
因为我们是使用 Filebeat 从 Client Server 传输日志到服务器 ELK Server,所以需要创建一个SSL 证书和密钥对。Filebeat 用该证书验证 ELK Server 的身份。创建将存储证书和私钥使用目录:
1 2 | sudo mkdir -p /etc/pki/tls/certs sudo mkdir /etc/pki/tls/private |
你有生成 SSL 证书的两种选择。如果你有一个 DNS 设置,让您的客户端服务器解析服务器 ELK 的 IP 地址,使用选项 2。否则,使用选项 1,将允许您使用 IP 地址。
选项1:IP 地址
如果你没有 DNS 设置——它允许你收集 log 的服务器,解析你的 ELK Server 的 IP 地址——你必须添加 ELK Server 的 private IP 地址到的 SSL 证书的 SubjectAltName(SAN)。要做这一步,打开 OpenSSL 的配置文件:
1 | sudo vi /etc/ssl/openssl .cnf |
找到文件中 [v3_ca] 板块,在下面添加这一行(替换 ELK Server 的 private IP 地址):
1 | subjectAltName = IP: ELK_server_private_IP |
保存,退出。
现在在相应位置产生 SSL 证书和私钥(在 /etc/PKI/TLS/),使用下面的命令:
1 2 | 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 的服务器上——稍候,我们会做这一步。让我们继续完成 Logstash 配置。如果您使用了此选项,跳过选项 2 并到 配置 Logstash 这一步。
选项2
如果你有个人网络的 DNS 设置,你应创建一个包含 ELK Server 的 private IP 地址的 A 记录——这个域名将在接下来的命令中使用,来生成 SSL 证书。或者,你可以用一个指向该服务器的公共 IP 地址的记录。只要确保你的服务器(收集日志的服务器)将能够解析域名到你的 ELK Server。
现在生成 SSL 证书和私钥:
1 2 | 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 的服务器上——稍候,我们会做这一步。让我们继续完成 Logstash 配置。
配置 Logstash:
Logstash 配置文件是 JSON 格式的,放在
1 | /etc/logstash/conf .d |
创建一个叫 02-beats-input.conf 的配置文件,并配置“filebeat”的 input:
1 | sudo vi /etc/logstash/conf .d /02-beats-input .conf |
输入下面的配置信息:
1 2 3 4 5 6 7 8 | input { beats { port => 5044 ssl => true ssl_certificate => "/etc/pki/tls/certs/logstash-forwarder.crt" ssl_key => "/etc/pki/tls/private/logstash-forwarder.key" } } |
保存,退出。指定的 beats 输入会监听 TCP 端口 5044,它将使用我们前面创建的 SSL 证书和私钥。
现在来创建 10-syslog-filter.conf 配置文件,在这里面我们会添加 syslog 信息的 filter:
1 | sudo vi /etc/logstash/conf .d /10-syslog-filter .conf |
输入下面的 syslog filter 配置信息:
1 2 3 4 5 6 7 8 9 10 11 12 13 | 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 类型的 logs(通过 Filebeat),而且它会使用 grok来解析传入的 syslog 日志,使之结构化和可查询。
最后,我们创建 30-elasticsearch-output.conf 配置文件:
1 | sudo vi /etc/logstash/conf .d /30-elasticsearch-output .conf |
输入下面的 output 配置信息:
1 2 3 4 5 6 7 8 9 | output { elasticsearch { hosts => [ "localhost:9200" ] sniffing => true manage_template => false index => "%{[@metadata][beat]}-%{+YYYY.MM.dd}" document_type => "%{[@metadata][type]}" } } |
保存,退出。这个 output 主要是配置 Logstash 去存储运行在 localhost:9200 上的 Elasticsearch beat 数据,这里有一个命名要求,由被使用的 beat 来命名(在这个情况下是filebeat)。
如果你想给其他使用 Filebeat input 的 application 添加 filters,请确保命名文件让它们在 input 和 output 的配置之间排序(即,02- 和 30- 之间)。
测试 Logstash 的配置信息:
1 | sudo service logstash configtest |
显示 Configuration OK 是对的,否则是错误的。请查看错误信息以确定 Logstash 配置信息那里出错了。
重启 Logstash,并启动,让改变的配置信息生效:
1 2 | sudo service logstash restart sudo update-rc.d logstash defaults 96 9 |
现在,我们来加载样例 Kibana 仪表盘。
加载 Kibana 仪表盘:
Elastic 提供了几种 Kibana 的仪表盘样例和 beat 索引模式,来帮助你开始使用 Kibana。虽然在我们的教程中不会使用仪表盘,但是不管怎么我们都可以用它包含的 Filebeat 和索引模式加载它们。
首先,下载仪表盘样例,存到你的 home 目录:
1 2 | cd ~ curl -L -O https: //download .elastic.co /beats/dashboards/beats-dashboards-1 .1.0.zip |
安装 unzip 包并解压:
1 2 | sudo apt-get -y install unzip unzip beats-dashboards-*.zip |
然后加载仪表盘样例、可视化和 beat 索引模式到 Elasticsearch:
1 2 | cd beats-dashboards-* . /load .sh |
这些是刚才我们加载的索引模式:
[packetbeat-]YYYY.MM.DD
[topbeat-]YYYY.MM.DD
[filebeat-]YYYY.MM.DD
[winlogbeat-]YYYY.MM.DD
当我们使用 Kibana,选择 Filebeat 索引模式作为我们的默认模式。
更多详情见请继续阅读下一页的精彩内容:http://www.linuxidc.com/Linux/2016-06/132616p2.htm
加载 Filebeat 索引模版到 Elasticsearch:
因为我们计划使用 Fliebeat 传输 logs 到 Elasticsearch,所以我们因该加载 Filebeat 索引模版。该索引模板将配置 Elasticsearch 以一种智能的方式来分析传入的 Filebeat 信息。
首先,下载 Filebeat 索引模版到 home 目录:
1 2 | cd ~ curl -O https: //gist .githubusercontent.com /thisismitch/3429023e8438cc25b86c/raw/d8c479e2a1adcea8b1fe86570e42abab0f10f364/filebeat-index-template .json |
然后加载它:
1 | curl -XPUT 'http://localhost:9200/_template/filebeat?pretty' -d@filebeat-index-template.json |
如果模板正确加载,你会看到这样的消息:
1 | Output:{ "acknowledged" : true } |
现在,我们的 ELK Server 已准备好接收 Filebeat 数据,让我们到每个 Client Server 上设置 Filebeat。
安装设置 Filebeat(添加 Client Servers):
在你要发送日志到 Logstash ELK Server 的所有 Ubuntu 或 Debian 的 server 做这一步。有关在基于 Red Hat Linux 发行版(RHEL 例如,CentOS 的,等等)安装 Filebeat 说明,请参阅在 CentOS 设置 Filebeat(添加客户端服务器)部分
复制 SSL 证书
在你的 ELK Server,复制 SSL 证书——这个教程之前创建的——到你的 Client Sever(用你自己的登录信息替换下面的 client server’s address):
1 | scp /etc/pki/tls/certs/logstash-forwarder .crt user@client_server_private_address: /tmp |
提供您的登录凭据后,确保证书复制成功。在 client servers 和 ELK Server 之间的通信,这是必须要的。
现在,我们将安装 Topbeat 包。
安装 Filebeat 包
在 Client Server,创建 Beats 资源列表:
1 | echo "deb https://packages.elastic.co/beats/apt stable main" | sudo tee -a /etc/apt/sources .list.d /beats .list |
它也和 Elasticsearch 使用相同的 GPG 密钥,可以使用下面的命令进行安装:
1 | wget -qO - https: //packages .elastic.co /GPG-KEY-elasticsearch | sudo apt-key add - |
然后,安装 Filebeat 包:
1 2 | sudo apt-get update sudo apt-get install filebeat |
安装好了,接下来来配置。
配置 Filebeat
现在,我们将配置 Filebeat 连接到 ELK Server 上的 Logstash。本节将引导你完成修改 Filebeat 自带示例的配置文件。当你完成这些步骤,你应该有一个看起来如下 的文件:
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 | filebeat: prospectors: - paths: - /var/log/auth .log - /var/log/syslog # - /var/log/*.log input_type: log document_type: syslog registry_file: /var/lib/filebeat/registry output: logstash: hosts: [ "elk_server_private_ip:5044" ] bulk_max_size: 1024 tls: certificate_authorities: [ "/etc/pki/tls/certs/logstash-forwarder.crt" ] shipper: logging: files: rotateeverybytes: 10485760 # = 10MB |
在 Client Server,创建和修改 Filebeat 配置文件:
1 | sudo vi /etc/filebeat/filebeat .yml |
注意:Filebeat 的配置文件是 YAML 格式,这意味着缩进是非常重要的!一定要使用相同数量的空格。
接近文件的顶部,你会看到 prospectors 部分,这是你可以定义指定 prospectors 哪些日志文件可以传送,以及他们应该如何处理。每个 prospectors 用“-”标明:
1 2 3 4 5 6 | ... paths: - /var/log/auth .log - /var/log/syslog # - /var/log/*.log ... |
然后,找到指定 DOCUMENT_TYPE: , 取消注释该行并改变其值设置为“syslog”。它修改后是这样的:
1 2 3 | ... document_type: syslog ... |
这指定 prospectors 的日志类型是 syslog(这是我们 Logstash filter 正在寻找的类型)。
如果你想发送其他的文件到你的 ELK 服务器,或对 Filebeat 如何处理你的日志进行任何更改,随意修改或添加 prospectors 条目。
接下来,在 output 部分,找到 elasticsearch: , 这表明 Elasticsearch 输出部分(我们不打算使用)。删除或注释掉整个 Elasticsearch output 部分(最多,到 #logstash:)行
找到注释掉的 Logstash 输出部分——#logstash:,取消注释(删除前面的#)。在本节中,取消 hosts:[“localhost:5044”] 行注释。改变 localhost 为你的 ELK 服务器的 private IP 地址(或主机名):
1 2 3 4 | ### Logstash as output logstash: # The Logstash hosts hosts: [ "ELK_server_private_IP:5044" ] |
这将配置 Filebeat 连接到 ELK Server 上的 Logstash 通过 5044 端口(我们指定的 Logstash输入的端口)。
直接在 hosts 下面,添加这一行:
1 | bulk_max_size: 1024 |
接着,找到 tls 部分,取消注释;并取消 certificate_authorities, 注释,改变它的值为[“/etc/pki/tls/certs/logstash-forwarder.crt”]:
1 2 3 | ... tls: # List of root certificates for HTTPS server verifications certificate_authorities: [ "/etc/pki/tls/certs/logstash-forwarder.crt" ] |
配置 Filebeat 使用我们的 ELK Server 上创建的 SSL 证书。
保存、退出。
重启 Fliebeat:
1 2 | sudo service filebeat restart sudo update-rc.d filebeat defaults 95 10 |
如果你不确定你的文件配置是否正确,可以查看这里。
测试 Filebeat 安装
如果您的 ELK stack 正确安装,Filebeat(客户端服务器上)应该传送 log 到 ELK Server 上的 Logstash。Logstash 应加载 Filebeat 数据到 Elasticsearch 以这样一个时间戳 filebeat-YYYY.MM.DD。
在你的 ELK Server,验证 Elasticsearch 确实通过 Filebeat 查询索引接收的数据:
1 | curl -XGET 'http://localhost:9200/filebeat-*/_search?pretty' |
你应该会看到这样的输出:
1 2 3 4 5 6 7 8 9 | 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" } } ... |
如果总点击数(hits)输出结果 0,Elasticsearch 没有在你搜索的索引下加载任何日志,你应该检查你的设置。如果你收到了预期的输出,继续下一步。
连接到 Kibana:
当您完成所有要收集日志的服务器的 Filebeat 设置,让我们来看看我们之前安装的 Web 界面 Kibana。
在 Web 浏览器中,转到 FQDN 或 ELK Server 的公共 IP 地址。使用“kibanaadmin”身份进入后,你会看到一个页面,提示您配置默认索引图案:
继续,然后从索引模式菜单(左侧)中选择 [filebeat]-YYY.MM.DD,然后单击星(设置为默认索引)按钮设置 Filebeat 指数为默认值。
现在点击顶部导航栏中的链接发现。默认情况下,这将显示在过去的 15 分钟所有的日志数据。您应该看到日志事件直方图,下面日志消息:
现在,不会有在那里多,因为你只是从客户端服务器收集系统日志。在这里,你可以搜索和浏览你的日志。您还可以自定义仪表板。
尝试这些操作:
搜索“root”来看看是否有人尝试用 root 身份登录你的服务器;
搜索特殊的 hostname;
通过对直方图选择一个区域或从上面的菜单中改变时间帧;
点击下面的柱状图信息,看数据是如何被过滤的。
总结:
现在你的 syslogs 通过 Elasticsearch 和 Logstash 集中化了,并且你可以通过 Kibana 查看它们。到这里,你应该有一个集中化重要 logs 很好的开始了。请记住你可以发送各种各样的log 或者是索引数据到 Logstash,但是如果是使用 grok 解析和结构化的数据会更加有用。
为了提升 ELK stack,你应该考虑使用 Logstash 收集和过滤其他日志,并创建 Kibana 仪表板 。您可能还需要通过 使用 Topbeat 与 ELK stack 收集系统指标。所有这些主题均包含在本系列的其他教程中。
ElasticSearch 的详细介绍:请点这里
ElasticSearch 的下载地址:请点这里
更多 Ubuntu 相关信息见Ubuntu 专题页面 http://www.linuxidc.com/topicnews.aspx?tid=2
本文永久更新链接地址:http://www.linuxidc.com/Linux/2016-06/132616.htm
前言:
在这个教程中, 将会全面介绍怎么在 Ubuntu 14.04上安装 Elasticsearch ELK Stack,也就是Elasticsearch 2.2.x, Logstash 2.2.x, 以及 Kibana 4.4.x。当然,这里也会涉及在一个集中点中怎么配置 Filebeat1.1x 来收集和可视化的系统日志的教程。Logstash 是收集、分析和存储日志以供日后使用的开源工具。Kibana 是一个 Web 界面,可用于搜索和查看 Logstash 已索引的日志。这两个工具都基于用于存储日志的 Elasticsearch。
在你试图找出服务器或应用程序问题时,集中化日志是非常有用的,因为它可以让你在一个地方搜索所有的日志。在确定跨多个服务器的问题这一点也非常有用,因为它在一个特定的时间范围内收集多个服务器的日志。
用 Logstash 可以收集很多类型的日志,但是在这个教程中我们限定范围为 syslog。
使用 Elasticsearch + Logstash + Kibana 搭建日志集中分析平台实践 http://www.linuxidc.com/Linux/2015-12/126587.htm
Linux 上安装部署 ElasticSearch 全程记录 http://www.linuxidc.com/Linux/2015-09/123241.htm
Elasticsearch 安装使用教程 http://www.linuxidc.com/Linux/2015-02/113615.htm
ElasticSearch 配置文件译文解析 http://www.linuxidc.com/Linux/2015-02/114244.htm
ElasticSearch 集群搭建实例 http://www.linuxidc.com/Linux/2015-02/114243.htm
分布式搜索 ElasticSearch 单机与服务器环境搭建 http://www.linuxidc.com/Linux/2012-05/60787.htm
ElasticSearch 的工作机制 http://www.linuxidc.com/Linux/2014-11/109922.htm
我们的目的:
这篇教程的目的是安装 Logstash 来收集多个 server 的 syslog,然后安装 Kibana 来可视化收集到的日志。
ELK stack 的安装有 4 个主要的组件:
Logstash:在 server 端,处理传入的日志。
Elasticsearch:存储所有的日志。
Kibana:Web界面,用来搜索和可视化日志;使用 Nginx 代理实现。
Filebeat:安装在 client 端(也就是你需要收集日志的目标服务器),将日志发送给 Logstash。Filebeat 端作为一个日志传送代理,使用的是 lumberjack 网络协议与 Logstash 通信。
我们先安装前三个组件,它们需要安装在同一个 server 上,这个 server 就是我们的 ELKServer。Filebeat 会安装在所有我们想要收集 log 的客户端,统称为 Client Servers。
安装前:
要完成这个教程,需要 Ubuntu 14.04 VPS 的 root 权限。配置的教程可以在这里找到:Initial Server Setup with Ubuntu 14.04
如果你想用 CentOS,看这个教程:How To Install Elasticsearch, Logstash, and Kibana (ELK Stack) on CentOS
ELK Server 的 CPU、RAM 和存储量的需求取决于你将要收集的 log 的数量。在这个教程中,我们将使用以下规格的一个 VPS 作为我们 ELK Server:
OS:Ubuntu 14.04
RAM:4GB
CPU:2
除了 ELK Server,你需要有其他的 Servers 作为日志来源。
现在开始配置 ELK 服务端。
安装 Java 8:
Elasticsearch 和 Logstash 需要 Java,所以我们需要安装。Elasticsearch 需要安装最新的 Oracle Java 8。当然,如果你要用 OpenJDK 的话,应该也不错。
添加 Oracle JavaPPA 到 apt:
1 | sudo add-apt-repository -y ppa:webupd8team /java |
更新 apt 包数据库:
1 | sudo apt-get update |
安装稳定版 Oracle Java8(接受弹出的协议内容):
1 | sudo apt-get -y install oracle-java8-installer |
Java 8 安装好了,接下来安装 Elasticsearch
安装 Elasticsearch:
Elasticsearch 可以用包管理器通过添加 Elastic 的包源列表进行安装。
用下面的命令来导入 Elasticsearch 公共 GPG 密钥到 apt:
1 | wget -qO - https: //packages .elastic.co /GPG-KEY-elasticsearch | sudo apt-key add - |
如果你的终端提示停在这里不动了,可能是在等你输入用户密码(为了授权 sudo 命令)。
创建 Elasticsearch 资源列表:
1 | 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 包数据库并安装 elasticsearch:
1 2 | sudo apt-get update sudo apt-get -y install elasticsearch |
安装好了,接下来编辑配置文档:
1 | sudo vi /etc/elasticsearch/elasticsearch .yml |
要限制你的 Elasticsearch 接口(端口 9200)外的访问,这样外人无法通过 HTTP API 读取数据或关闭您的 Elasticsearch 集群。找到 network.host,取消注释,用 localhost 替换它的值:
1 | network.host: localhost |
保存并退出 elasticsearch.yml。
现在,打开 Elasticsearch:
1 | sudo service elasticsearch restart |
然后运行以下命令将在系统启动时启动 Elasticsearch:
1 | sudo update-rc.d elasticsearch defaults 95 10 |
现在 Elaticsearch 设置好也启动了,现在来安装 Kibana。
安装 Kibana:
Kibana 可以用包管理器通过添加 Elastic 的包源列表进行安装。
创建 Kibana 资源列表:
1 | 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 包数据源并安装:
1 2 | sudo apt-get update sudo apt-get -y install kibana |
这样就安装好了。
打开 Kibana 配置文件编辑:
1 | sudo vi /opt/kibana/config/kibana .yml |
在文件中找到 server.host,用 localhost 替换 0.0.0.0:
1 | server.host: "localhost" |
保存,退出。这个操作让 Kibana 只能被 localhost访问。不要担心,我们会用 Nginx反向代理来允许外部访问。
现在启用 Kibana 服务:
1 2 | sudo update-rc.d kibana defaults 96 9 sudo service kibana start |
在使用 Kibana Web 界面的之前,我们必须安装反向代理。接下来就来安装 Ngnix 吧!(著:如果不用反向代理的话,上一步是不需要把 server.host 改为 localhost,直接访问该主机的 5601 端口即可)
安装 Ngnix:
因为我们配置了 Kibana 监听 localhost,我们必须安装反向代理来允许外部访问。这里就使用 Ngnix 来达成这个目的。
注意:如果你已经有要用的 Ngnix 实例,那就直接使用。只要记得去配置 Kibana,让 Ngnix server 可以访问(你可能需要在 /opt/kibana/config/kibana.yml 改变 host 的值为你的 Kibana server 的 private IP 或者 hostname)。此外,建议您启用 SSL / TLS。
用 apt 安装 Ngnix 和 Apache2-utils:
1 | sudo apt-get install nginx apache2-utils |
用 htpasswd 命令 创建一个 admin 用户,叫 Kibanaadmin(根据自己喜好命名),用来访问 Kibana Web 界面:
1 | sudo htpasswd -c /etc/nginx/htpasswd . users kibanaadmin |
在命令提示终端输入密码。记住用户名和密码,稍候你需要用它来访问 Kibana Web 界面。
现在用你喜欢的编辑器打开 Nginx 的默认服务器模块。我们将用 vi:
1 | sudo vi /etc/nginx/sites-available/default |
删除文件中的内容,复制下面的代码块到文件中。请确保 server_name 和你的 server_name 匹配:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | # cat /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 的配置通过监听 localhost:5601,让你的服务器的 HTTP 流量直接到 Kibana 应用程序。此外,Nginx 的将使用我们前面创建的 htpasswd.users 文件,也会要求基本身份验证。
现在重启 Nginx 让之前的改变生效:
1 | sudo service nginx restart |
Kibana 现在是可访问的,通过 FQDN 也就是你的 ELKServer 公共 IP 地址。http://elk_server_public_ip/ 如果你在浏览器中访问这个地址,然后输入“kibanaadmin”验证。这样,你就可以看到 Kibana 的欢迎界面,在这里它会要求你配置 index 类型。不要管那么多拉,我们待会再来研究,先回去安装其他组件。
安装 Logstash:
Logstash 软件包和 Elasticsearch 的在同一个版本库,之前我们已经添加了这个公共密钥。所以,直接创建 Lostash 的资源列表:
1 | 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 包数据源并安装:
1 2 | sudo apt-get update sudo apt-get install logstash |
安装好了!但是还没有配置。
生成 SSL 证书:
因为我们是使用 Filebeat 从 Client Server 传输日志到服务器 ELK Server,所以需要创建一个SSL 证书和密钥对。Filebeat 用该证书验证 ELK Server 的身份。创建将存储证书和私钥使用目录:
1 2 | sudo mkdir -p /etc/pki/tls/certs sudo mkdir /etc/pki/tls/private |
你有生成 SSL 证书的两种选择。如果你有一个 DNS 设置,让您的客户端服务器解析服务器 ELK 的 IP 地址,使用选项 2。否则,使用选项 1,将允许您使用 IP 地址。
选项1:IP 地址
如果你没有 DNS 设置——它允许你收集 log 的服务器,解析你的 ELK Server 的 IP 地址——你必须添加 ELK Server 的 private IP 地址到的 SSL 证书的 SubjectAltName(SAN)。要做这一步,打开 OpenSSL 的配置文件:
1 | sudo vi /etc/ssl/openssl .cnf |
找到文件中 [v3_ca] 板块,在下面添加这一行(替换 ELK Server 的 private IP 地址):
1 | subjectAltName = IP: ELK_server_private_IP |
保存,退出。
现在在相应位置产生 SSL 证书和私钥(在 /etc/PKI/TLS/),使用下面的命令:
1 2 | 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 的服务器上——稍候,我们会做这一步。让我们继续完成 Logstash 配置。如果您使用了此选项,跳过选项 2 并到 配置 Logstash 这一步。
选项2
如果你有个人网络的 DNS 设置,你应创建一个包含 ELK Server 的 private IP 地址的 A 记录——这个域名将在接下来的命令中使用,来生成 SSL 证书。或者,你可以用一个指向该服务器的公共 IP 地址的记录。只要确保你的服务器(收集日志的服务器)将能够解析域名到你的 ELK Server。
现在生成 SSL 证书和私钥:
1 2 | 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 的服务器上——稍候,我们会做这一步。让我们继续完成 Logstash 配置。
配置 Logstash:
Logstash 配置文件是 JSON 格式的,放在
1 | /etc/logstash/conf .d |
创建一个叫 02-beats-input.conf 的配置文件,并配置“filebeat”的 input:
1 | sudo vi /etc/logstash/conf .d /02-beats-input .conf |
输入下面的配置信息:
1 2 3 4 5 6 7 8 | input { beats { port => 5044 ssl => true ssl_certificate => "/etc/pki/tls/certs/logstash-forwarder.crt" ssl_key => "/etc/pki/tls/private/logstash-forwarder.key" } } |
保存,退出。指定的 beats 输入会监听 TCP 端口 5044,它将使用我们前面创建的 SSL 证书和私钥。
现在来创建 10-syslog-filter.conf 配置文件,在这里面我们会添加 syslog 信息的 filter:
1 | sudo vi /etc/logstash/conf .d /10-syslog-filter .conf |
输入下面的 syslog filter 配置信息:
1 2 3 4 5 6 7 8 9 10 11 12 13 | 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 类型的 logs(通过 Filebeat),而且它会使用 grok来解析传入的 syslog 日志,使之结构化和可查询。
最后,我们创建 30-elasticsearch-output.conf 配置文件:
1 | sudo vi /etc/logstash/conf .d /30-elasticsearch-output .conf |
输入下面的 output 配置信息:
1 2 3 4 5 6 7 8 9 | output { elasticsearch { hosts => [ "localhost:9200" ] sniffing => true manage_template => false index => "%{[@metadata][beat]}-%{+YYYY.MM.dd}" document_type => "%{[@metadata][type]}" } } |
保存,退出。这个 output 主要是配置 Logstash 去存储运行在 localhost:9200 上的 Elasticsearch beat 数据,这里有一个命名要求,由被使用的 beat 来命名(在这个情况下是filebeat)。
如果你想给其他使用 Filebeat input 的 application 添加 filters,请确保命名文件让它们在 input 和 output 的配置之间排序(即,02- 和 30- 之间)。
测试 Logstash 的配置信息:
1 | sudo service logstash configtest |
显示 Configuration OK 是对的,否则是错误的。请查看错误信息以确定 Logstash 配置信息那里出错了。
重启 Logstash,并启动,让改变的配置信息生效:
1 2 | sudo service logstash restart sudo update-rc.d logstash defaults 96 9 |
现在,我们来加载样例 Kibana 仪表盘。
加载 Kibana 仪表盘:
Elastic 提供了几种 Kibana 的仪表盘样例和 beat 索引模式,来帮助你开始使用 Kibana。虽然在我们的教程中不会使用仪表盘,但是不管怎么我们都可以用它包含的 Filebeat 和索引模式加载它们。
首先,下载仪表盘样例,存到你的 home 目录:
1 2 | cd ~ curl -L -O https: //download .elastic.co /beats/dashboards/beats-dashboards-1 .1.0.zip |
安装 unzip 包并解压:
1 2 | sudo apt-get -y install unzip unzip beats-dashboards-*.zip |
然后加载仪表盘样例、可视化和 beat 索引模式到 Elasticsearch:
1 2 | cd beats-dashboards-* . /load .sh |
这些是刚才我们加载的索引模式:
[packetbeat-]YYYY.MM.DD
[topbeat-]YYYY.MM.DD
[filebeat-]YYYY.MM.DD
[winlogbeat-]YYYY.MM.DD
当我们使用 Kibana,选择 Filebeat 索引模式作为我们的默认模式。
更多详情见请继续阅读下一页的精彩内容:http://www.linuxidc.com/Linux/2016-06/132616p2.htm