写在前面的话

这是一篇译文,觉得写得蛮好就翻译了一下,翻译并没有严格按照字句逐句翻译,原文见点击这里

经过测试,原教程是在ubuntu 14.04上搭建,但是可以在12.04和16.04上正常搭建成功!

简介

本文介绍了如何在Ubuntu 14.04上搭建基于ELK(Elasticsearch 2.2.x,Logstash 2.2.x,Kibana 4.4.x)的日志管理系统。同时会叫你展示如何采用Filebeat 1.1.x来收集syslog,并配置该日志管理系统,使之可以在一个地方集中的收集和图形化展示你的syslogs。Logstash是一个收集、解析和存储日志用于以后分析的开源工具。Kibana用于搜索和显示Logstash收集的日志。Elasticsearch用于存储来自经过Logstash解析的日志。

集中话的日志管理系统对于定位你服务器和应用出现的问题非常有用,因为它可以让你在一个地方就可以搜索所有的日志并且可以通过关联某个时间段中的所有log,帮你定位横跨多个服务节点的问题。

当前教程只展示了如何收集syslog,但是参照该过程,可以方便的运用Logstash进行其他类型日志的收集。

目标

本文的目标就是设置Logstash来收集多台服务器的syslog并存储到Elasticsearch,同时设置Kibana来可视化的收集到的日志。

该日志系统的主要组成部分如下:

  • Logstash:安装在服务器端,用于处理Filebeat发送过来的logs
  • Elasticsearch:存储所有的日志
  • Kibana:搜索和可视化日志的web服务,并且通过nginx作为前端的web服务器
  • Filebeat:安装在客户端,通过其发送logs数据给Logstash。它是一个日志传送的中间人,运用了lumberjack网络协议来和Logstash进行通信。

alt

我们首先设置好服务端的三个组件,我们称为ELK 服务器端。Filebeat将被安装在我们需要收集的日志所在的客户端服务器上,我们称为客户端服务器。

预备内容

为了可以完成此教程,你需要Ubuntu 14.04 服务器的root权限。相关的设置方法可以参考此文中的第三和第四步。

如果你服务器是CentOS系统,可以参看此文: How To Install ELK on CentOS 7

ELK服务器的CPU、内存和硬盘的容量取决于你收集的日志大小。在此教程中,ELK服务器的配置如下:

  • OS:Ubuntu 14.04
  • RAM: 4GB
  • CPU: 2 除了ELK服务器,我们还需要至少一台其他的服务器用于提供其上的syslog。 接下来让我们开始搭建我们的日志管理系统吧
安装 JAVA 8

Elasticsearch和Logstash依赖Java,因此首先得安装Java。我们将会安装Oracle Java的最新版本 Java 8,因为Elasticsearch推荐使用该版本。理论上也支持OpenJDK,如果你已经装好了OpenJDK。

添加Oracle 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环境后,接下来我们要安装Elasticsearch

Elasticsearch安装

添加Elastic的包来源后就可以通过Ubuntu的包管理系统安装Elasticsearch。

导入Elasticsearch的公共GPG key:

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

更新包管理数据库,并安装

sudo apt-get update; sudo apt-get -y install elasticsearch

安装好后开始进行Elasticsearch的配置,编辑其配置文件:

sudo vi /etc/elasticsearch/elasticsearch.yml

我们需要限制外网访问Elasticsearch数据,防止其他人读取你的数据或者通过HTTP API关闭Elasticsearch服务。在配置文件中找到network.host,取消其注释,其值设置为“localhost”,如下所示:

network.host: localhost

修改配置后,需重启服务:

sudo service elasticsearch restart

设置开机启动:

sudo update-rc.d elasticsearch defaults 95 10

至此,Elasticsearch安装配置完毕,接下来按照Kibana。

可以通过curl "localhost:9200/_nodes?pretty=true&settings=true"来获取Elasticsearch的配置内容,其中你可能感兴趣的是其各个路劲:

"path" : {
          "data" : "/var/lib/elasticsearch",
          "home" : "/usr/share/elasticsearch",
          "conf" : "/etc/elasticsearch",
          "logs" : "/var/log/elasticsearch"
        },

以上是其默认的数据存储、日志等路劲

Kibana安装

同样其可以通过Ubuntu的包管理器进行安装,安装步骤如下:

# 添加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

# 更新软件包数据库并安装软件
sudo apt-get update; sudo apt-get -y install kibana

安装完毕后对Kibana进行配置,其配置文件路劲:/opt/kibana/config/kibana.yml,修改其中的server.host选项,设置其为“localhost”,这样外网就无法直接访问,我们后续会使用nginx作为反向代理来访问其服务:

server.host: "localhost"

设置开机启动和启动服务:

sudo update-rc.d kibana defaults 96 9
sudo service kibana start
设置Nginx,使Kibana可以被外网访问

一般Ubuntu会默认带有Nginx,但是其版本一般会比较底,你可以选择升级或就用原来的,都没有问题。具体的Nginx的升级安装可以自己google。

由于Kibana没有用户管理这一模块,所以需要用到htpasswd来生成登陆用户明和密码,因此,需要首先安装apache2-utils

sudo apt-get install apache2-utils

输入一下命令生成登陆用户名和密码,示例用户名为kibanaadmin:

sudo htpasswd -c /etc/nginx/htpasswd.users kibanaadmin

记住刚刚设置的用户名和密码,待会访问时会用到

接下来就是设置一个nginx的server,在/etc/nginx/sites-available/新建一个文件kibana,设置其内容:

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;        
    }
}

该设置内容为在localhost:5601上的Kibana服务设置了反向代理,同时通过htpassswd.users设置了基本的用户认证,这样就可以使用我们原先设置的用户登陆了。

然后创建软连接,试该server配置可以在重启后生效:

ln -s /etc/nginx/sites-available/kabana /etc/nginx/sites-enbled/kabana

重启Nginx,让新的配置生效:

sudo service nginx restart

经过以上配置,我们就可以通过我们设置的域名或公网IP访问到Kibana服务了,如果你通过浏览器访问,会让你输入登陆信息,记得输入之前配置的用户和密码就可以登陆进去了。

安装Logstash
# 添加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

# 更新包管理数据库并安装
sudo apt-get update; sudo apt-get install logstash
生成SSL证书

因为我们需要用Filebeat把日志从客户端发送到服务端,因此需要创建SSL证书保证传输安全,首先需要创建一下两个文件夹,用来存放生成的证书

sudo mkdir -p /etc/pki/tls/certs
sudo mkdir /etc/pki/tls/private

然后,生成SSL证书分为两种情况:1、你没有域名只有公网IP;2、有域名,接下来将分成两块来解说。

  • 1、只有IP地址

如果你没有域名,那么你需要把你ELK服务器的IP地址先加到证书的subjectAltName属性中。打开/etc/ssl/openssl.cnf文件,找到[ v3_ca ]部分,然后把下面的内容添加到其下面:

subjectAltName = IP: ELK_server_private_IP

保存&退出,然后通过一下命令生成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
  • 2、有自己的域名,并指向了ELK服务器

直接通过一下命令生成SSL证书:

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

其中ELK_server_fqdn就是你自己的域名

生成的logstash-forwarder.crt将会被发送到客户端服务器用于认证用。接下来我们继续Logstash的配置。

配置Logstash

Logstash的配置文件是JSON格式的,他们存放在/etc/logstash/conf.d,配置文件包含:输入、过滤解析和输出3个部分。

先来设置输入配置,新建文件/etc/logstash/conf.d/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"
  }
}

输入配置中,设置了beats需要发送到那个tcp端口,并且配置了采用SSL的方式传输。

然后新建过滤配解析配置文件:/etc/logstash/conf.d/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" ]
    }
  }
}

以上配置文件中设置了我们的过滤器只对syslog类型的日志会做过滤,同时采用了grok作为解析获得的日志的工具

最后,新建输出配置文件:/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]}"
  }
}

输出配置文件设置了跑在localhost:9200上的Elasticsearch作为存储服务,并设置了索引名字。

如果你还想配置其他日志输入,建议开头设置为在02~30之间,这样文件排序就会在输入和输出之间了。

可以通过一下命令测试配置是否正确,如果返回Configuration OK,则代表没有问题

sudo service logstash configtest

最后重启Logstash并设置开机启动

sudo service logstash restart
sudo update-rc.d logstash defaults 96 9
配置Kibana Dashboard

Elastic提供了几种Kibana Dashboard的样板、Beats的索引样板方便我们刚开始了解Kibana。虽然我们在此教程中不会用到Dashboard样板,但是Filebeat 的索引样板我们会用到,因此一并在此统一设置。

首先,下载Dashboards压缩文件,并解压:

cd ~
curl -L -O https://download.elastic.co/beats/dashboards/beats-dashboards-1.1.0.zip

# 解压文件:
unzip beats-dashboards-*.zip

然后载入样板Dashboard和Beats索引

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来发送日志到ELK服务器,需要加载一个Filebeat索引模板方便Elasticsearch更加智能的分析传送过来的日志。

首先我们下载Filebeat索引模板

cd ~
curl -O https://gist.githubusercontent.com/thisismitch/3429023e8438cc25b86c/raw/d8c479e2a1adcea8b1fe86570e42abab0f10f364/filebeat-index-template.json

然后Elasticsearch加载该模板

curl -XPUT 'http://localhost:9200/_template/filebeat?pretty' -d@filebeat-index-template.json

如果加载成功会返回如下的正确信息:

# 正确返回:
{
  "acknowledged" : true
}

到此为止,我们的ELK服务器已经就绪,可以接受Filebeat发送的日志数据了。

在客户服务器上设置Filebeat

以下设置部署仅限于在Ubuntu或者Debian系统上,如果是在基于Red Hat的发行版(比如RHEL,CentOS等),请点击这篇博文的Filebeat设置章节

复制SSL证书到客户端服务器

登录到ELK服务器上,用scp命令传输

scp -P ssh_port /etc/pki/tls/certs/logstash-forwarder.crt user@client_server_private_address:/tmp

然后登陆到客户端服务器,复制刚才传输的SSL证书到此目录:/etc/pki/tls/certs

sudo mkdir -p /etc/pki/tls/certs
sudo cp /tmp/logstash-forwarder.crt /etc/pki/tls/certs/
安装Filebeat Package
# 创建Beats的软件源
echo "deb https://packages.elastic.co/beats/apt stable main" |  sudo tee -a /etc/apt/sources.list.d/beats.list

# 设置GPG key
wget -qO - https://packages.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -

# 更新&安装
sudo apt-get update; sudo apt-get install filebeat
配置Filebeat

在客户端服务器编辑配置文件:/etc/filebeat/filebeat.yml

==注意: Filebeat的配置文件是YAML格式的,意味着每一行我们的空格个数很重要==

在配置文件的顶部,可以找到prospectors配置项,在这里我们可以配置prospectors,其决定了需要传送哪些日志。每个prospector以-开始

我么将修改现存的prospector,让它可以传送客户端系统syslog和auth.log到ELK服务器。在path配置项中,进行如下设置:

      paths:
        - /var/log/auth.log
        - /var/log/syslog
#        - /var/log/*.log

然后找到document_type配置项,设置如下:

document_type: syslog

这个配置项注明了这个prospector的日志类型为syslog

接下来,在output项中,找到elasticsearch项,直接把这个输出项注释掉,然后找到#logstash项,去掉注释,我们的Filebeat的输出对象是ELK服务器上的Logstash。

### Logstash as output
  logstash:
    # The Logstash hosts
    hosts: ["ELK_server_private_IP:5044"]
    bulk_max_size: 1024

上面配置了Filebeat和ELK服务器上Logstash的连接方式

然后找到tls项,去掉注释进行SSL配置:

    tls:
      # List of root certificates for HTTPS server verifications
      certificate_authorities: ["/etc/pki/tls/certs/logstash-forwarder.crt"]

最后重启Filebeat并设置开机启动:

sudo service filebeat restart
sudo update-rc.d filebeat defaults 95 10

通过以上几部的配置,Filebeat就可以把客户端服务器的syslog和auth.log传送到ELK服务器端了,重复以上步骤到你想进行日志监控的其他客户端服务器就可以实现日志的集中管理。

测试Filebeat是否安装配置正确

如果你的ELK服务器按照上面的步骤配置好并成功启动了,那么Filebeat就会发送相应的日志到ELK服务器上的Logstash,Logstash就会把数据存储到Elasticsearch中的索引:filebeat-YYYY.MM.DD

在你的ELK服务器上发送一下请求,用于验证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"}
    }
...

如果你的输出为0 total hits,那么哪里设置有问题,你需要按照上面的步骤仔细检查一下

Kibana简单使用说明

通过域名或IP可以访问Kibana,输入之前配置的用户名和密码,登陆后你应该可以看到一个提示你配置默认索引的页面。 alt

你可以在左侧面板中随意选择一个索引,点击星星按钮把它设置为默认

然后点击坐上角上的discover链接,默认这个页面会显示最近15分钟内所有抓取的日志数据,你应该会看到一个日志获取数目的柱状图及详细的日志信息,如下: alt

到现在为止,还不会有太多的数据因为你只是收集了客户端服务器上的syslog日志。在这个页面你可以搜索和浏览所有的日志,当前你也可以定制你自己的dashboard。

你可以尝试一下一下的使用:

  • 在搜索栏输入“root”,用于查看是否有人想用root用户身份登陆
  • 搜索某个特殊的主机名(比如: "hostname")
  • 在右上角改变时间区间,用户查看不同时间段中的日志
  • 点击柱状图下面的信息,看一下我们的日志是如何被过滤的

Kibana还有许多其他的功能,向绘图及过滤等,你可以自己慢慢学习使用,这里就不仔细讲解。

结论

经过以上的配置,你的日志就可以被集中存放并且可以通过Kibana集中查看搜索。集中管理你的日志是一个好的开端。记住你可以发送任意类型的log数据给Logstash,但是如配合使用grok,那么获取到的日志数据将会被解析和结构化,更加方便我们查看。

为了改进你的ELK服务器,你应该深入的学习了解一下使用Logstash收集和过滤其他你觉得需要管理的日志并且设置dashboard方便日志统计查看。你可能也想要使用Topbeat收集客户端服务器的系统基础监控信息 所有的这些内容都将在这个系列教程中提供。