内容简
在本篇教程中,我们将探讨Logstash 1.4.2与Kibana 3的安装方式,以及如何对二者配置以通过集中化方式收集系统日志信息并进行可视化处理。Logstash是一款用于收集、解析并存储日志信息以备日后使用的开源工具。Kibana 3则是一套Web界面,旨在帮助用户对Logstash收集到的日志进行搜索与查看。这两款工具皆基于Elasticsearch。Elasticsearch、Logstash与Kibana在协同使用的情况下,往往被统称为ELK堆栈。
对日志信息进行集中化处理对识别并解决服务器乃至应用程序问题非常重要,我们可以借此对全部日志信息进行统一查询。另外,这种作法也能帮助大家对特定时间段内的日志进行关联,从而发现跨越多台服务器的复杂问题。
我们可以利用Logstash对各类日志进行收集,但在今天的教程中,我们会对简化所收集日志的类型以降低理解难度。
目标
本教程的目标在于设置Logstash以收集来自多台服务器的系统日志,同时设置Kibana对这些收集到的日志进行可视化处理。
我们的Logstash/Kibana设置工作共分为四个主要步骤:
- Logstash: Logstash服务器组件,用于处理输入日志信息
- Elasticsearch: 保存全部日志信息
- Kibana: 用于搜索并实现日志可视化处理的Web界面
- Logstash Forwarder: 安装在服务器之上以将日志信息发送至Logstash,Logstash Forwarder作为一套日志转发代理利用_lumberjack_网络协议与Logstash进行通信
我们将在单一服务器之上安装这三项首先组件,并将其作为我们的Logstash服务器。Logstash Forwarder将被安装在全部需要进行日志收集的服务器之上,接下来我们将这些收集对象统称为“服务器”。
先决条件
要完成这篇教程,大家需要以root方式访问Ubuntu 14.04 VPS。第三与第四步中所提到的指令设置方式可从利用Ubuntu 14.04进行服务器初始设置一文中找到。
我们这台Logstash服务器所需要的CPU、内存与存储容量具体取决于大家需要收集的日志信息总量。着眼于本篇教程,我们将选择一套具备如下配置的VPS(即虚拟专用服务器)作为Logstash服务器:
- 操作系统: Ubuntu 14.04
- 内存: 4GB
- CPU: 2
除了Logstash服务器,大家还需要其它几台服务器作为日志收集对象。
下面让我们首先进行Logstash服务器设置!
安装Java 7
Elasticsearch与Logstash需要配合Java 7使用,因此我们需要首先安装这套软件包。这里我们选择安装Oracle Java 7,因为Elasticsearch建议选择该版本。不过其同样支持OpenJDK,所以各位可以随意选择。
将Oracle Java PPA添加至apt:
sudo add-apt-repository -y ppa:webupd8team/java
对我们的apt软件包数据库进行更新:
sudo apt-get update
利用以下命令安装Oracle Java 7的最新稳定版本(并接受弹出的许可协议):
sudo apt-get -y install oracle-java7-installer
现在Java 7已经安装完成,下面安装Elasticsearch。
安装Elasticsearch
注意:Logstash 1.4.2建议配合Elasticsearch 1.1.1。
运行以下命令以将Elasticsearch公共GPG密钥导入apt:
wget -O - http://packages.elasticsearch.org/GPG-KEY-elasticsearch | sudo apt-key add -
创建Elasticsearch源列表:
echo 'deb http://packages.elasticsearch.org/elasticsearch/1.1/debian stable main' | sudo tee /etc/apt/sources.list.d/elasticsearch.list
更新我们的apt软件包数据库:
sudo apt-get update
利用以下命令安装ELasticsearch:
sudo apt-get -y install elasticsearch=1.1.1
Elasticsearch现在已经安装完成,下面对其配置文件进行编辑:
sudo vi /etc/elasticsearch/elasticsearch.yml
将以下内容添加到文件当中,旨在禁用其动态脚本:
script.disable_dynamic: true
我们还需要限制指向Elasticsearch实例(端口9200)的外部访问,这样外部人员就无法读取我们的数据或者通过HTTP API关闭我们的Elasticsearch集群了。找到配置文件中的network.host部分并取消其注释,修改后的内容如下:
network.host: localhost
保存并退出elasticsearch.yml文件。
现在启动Elasticsearch:
sudo service elasticsearch restart
接下来运行以下命令以进行Elasticsearch引导:
sudo update-rc.d elasticsearch defaults 95 10
现在Elasticsearch已经启动并开始运行,下面进行Kibana安装。
安装Kibana
注意:Logstash 1.4.2建议枉Kibana 3.0.1。
利用以下命令将Kibana下载至我们的主目录:
cd ~; wget https://download.elasticsearch.org/kibana/kibana/kibana-3.0.1.tar.gz
利用tar提取Kibana归档文件:
tar xvf kibana-3.0.1.tar.gz
打开Kibana配置文件以进行编辑:
sudo vi ~/kibana-3.0.1/config.js
在Kibana配置文件当中,找到指定elasticsearch的一行,并将其端口数字(默认为9200)替换为80:
elasticsearch: "http://"+window.location.hostname+":80",
这一步非常必要,因为我们希望通过端口80访问Kibana(即http://logstash_server_public_ip/)。
我们将利用Nginx实现Kibana安装,因此我们需要将各文件移动至合适的位置。通过以下命令创建一个目录:
sudo mkdir -p /var/www/kibana3
现在将Kibana文件复制到这个刚刚创建的目录中:
sudo cp -R ~/kibana-3.0.1/* /var/www/kibana3/
在使用该Kibana Web界面之前,我们还需要安装Nginx。下面马上开始。
安装Nginx
利用apt进行Nginx安装:
sudo apt-get install nginx
考虑到用户利用Elasticsearch使用Kibana界面的实际方式(用户需要能够直接访问Elasticsearch),因此我们需要配置Nginx以将指向端口80的请求代理至端口9200(Elasticsearch默认监听该端口)。幸运的是,Ibana提供一套示例Nginx配置,其中已经完成了大部分设置工作。
从Kibana的GitHub Repo中下载该示例Nginx配置,并将其移动至我们的主目录内:
cd ~; wget https://gist.githubusercontent.com/thisismitch/2205786838a6a5d61f55/raw/f91e06198a7c455925f6e3099e3ea7c186d0b263/nginx.conf
打开该示例配置文件以进行编辑:
vi nginx.conf
找到并变更server_name值以指向我们的FQDN(如果大家没有使用域名,则指向本地主机),并将我们安装Kibana的目录设为root,这样其条目显示结果应如下所示:
server_name FQDN;
root /var/www/kibana3;
保存并退出。现在利用以下命令将其复制到我们的Nginx默认server block当中:
sudo cp nginx.conf /etc/nginx/sites-available/default
接下来要安装apache2-utils,所以我们skywget htpasswd以生成一组用户名及密码:
sudo apt-get install apache2-utils
而后生成一条登录凭证以用于Kibana_存储并共享仪表板_(请替换成您实际使用的用户名):
sudo htpasswd -c /etc/nginx/conf.d/kibana.myhost.org.htpasswd user
接下来输入密码并确认。该htpasswd文件会被引用至我们刚刚配置完成的Nginx配置文件当中。
现在重启Nginx以应用上述变更:
sudo service nginx restart
大家已经可以通过FQDN或者Logstash服务器的公共IP地址(即http://logstash_server_public_ip/)访问Kibana了。如果大家使用浏览器进行访问,则会看到Kibana的欢迎页面并允许我们在这里查看仪表板。不过由于Logstash尚未设置完成,因此其中并没有任何可供查看的日志信息。
安装Logstash
大家可以在Elasticsearch的同一套Repo中找到Logstash软件包,而且由于我们已经安装了该公共密钥,因此可以马上创建Logstash源列表:
echo 'deb http://packages.elasticsearch.org/logstash/1.4/debian stable main' | sudo tee /etc/apt/sources.list.d/logstash.list
更新我们的apt软件包数据库:
sudo apt-get update
利用以下命令安装Logstash:
sudo apt-get install logstash=1.4.2-1-2c0f5a1
现在Logstash已经安装完成,但尚未进行配置。
生成SSL证书
由于我们需要利用Logstash Forwarder将来自各服务器的日志发送至Logstash服务器,所以创建SSL证书与密钥对就成了必要的一环。该证书由Logstash Forwarder用于验证Logstash服务器身份。利用以下命令创建用于容纳该证书及私有密钥的目录:
sudo mkdir -p /etc/pki/tls/certs
sudo mkdir /etc/pki/tls/private
现在大家有两种选项来生成自己的SSL证书。如果大家设置了DNS并允许客户端服务器解析该Logstash服务器的IP地址,则可使用选项二。如若不然,大家则应利用选项一以使用IP地址。
选项一:IP地址
如果大家没有设置DNS——用于帮助日志收集目标服务器解析Logstash服务器的IP地址——则需要在SSL证书中的subjectAltName(SAN)字段中添加Logstash服务器的私有IP地址。要完成这项工作,需要打开其OpenSSL配置文件:
sudo vi /etc/ssl/openssl.cnf
找到文件中的[ v3_ca ]部分,并将以下命令行添加至其之后(将对应部分替换为我们的Logstash服务器私有IP地址):
subjectAltName = IP: logstash_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发送日志的服务器当中,不过我们可以稍后再进行这项工作。到这里Logstash的配置工作就全部结束了。现在大家可以直接跳过选项二并直接进行Logstash配置了。
选项二:FQDN(DNS)
如果大家的私有网络拥有DNS设置,则可以记录一条A记录并向其中添加Logstash服务器的私有IP地址。我们可以在接下来的命令中使用该域名生成SSQL证书。另外,大家也可以使用一条记录以指向该服务器的公共IP地址。请确保大家的各服务器(即需要进行日志收集的服务器)能够解析Logstash服务器的域名。
现在在合适的位置(/etc/pki/tls/…)生成SSL证书与私有密钥,具体命令如下(将其中的对应部分替换为Logstash服务器的FQDN):
cd /etc/pki/tls; sudo openssl req -subj '/CN=logstash_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
Logstash配置文件为JSON格式,并被保存在/etc/logstash/conf.d当中。其配置内容由三部分构成:inputs、filters与outputs。
让我们首先创建一个名为01-lumberjack-input.conf的配置文件,并将我们的“lumberjack” input(即Logstash Forwarder所需使用的协议):
sudo vi /etc/logstash/conf.d/01-lumberjack-input.conf
将以下input添加至配置当中:
input {
lumberjack {
port => 5000
type => "logs"
ssl_certificate => "/etc/pki/tls/certs/logstash-forwarder.crt"
ssl_key => "/etc/pki/tls/private/logstash-forwarder.key"
}
}
保存并退出。其将指定一条负责监听tcp端口5000的lumberjack input,并使用我们之前创建完成的SSL证书与私有密钥。
现在让我们创建一个名为10-syslog.conf的配置文件,用于为系统日志消息添加filter:
sudo vi /etc/logstash/conf.d/10-syslog.conf
将以下命令添加至系统日志filter配置当中:
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”类型(由Logstash Forwarder标记)的日志,并尝试利用“grok”解析输入的syslog日志以调整其结构并实现可查询性。
最后,我们需要创建一个名为30-lumberjack-output.conf的配置文件:
sudo vi /etc/logstash/conf.d/30-lumberjack-output.conf
将以下output插入配置当中:
output {
elasticsearch { host => localhost }
stdout { codec => rubydebug }
}
保存并退出。该output的主要作用是配置Logstash以将日志信息存储在Elasticsearch当中。
通过上述配置,Logstash将能够接收与filter不匹配的日志,但相关数据不会进行结构化调整(例如非过滤的Nginx或者Apache日志将显示为普通消息,而非根据HTTP响应代码、源IP地址以及相关文件等进行划分的分类消息)。
如果大家需要为其它同样使用Logstash Forwarder input的应用程序,则须确保各文件的名称排序在input与output配置之间(即在01到30之间)。
重启Logstash以应用上述变更:
sudo service logstash restart
现在我们的Logstasha服务器已经准备就绪,下面设置Logstash Forwarder。
设置Logstash Forwarder
注意:大家需要在每台日志收集对象服务器上执行下列操作。要了解在红帽Linux发行版(例如RHEL与CentOS等)上安装Logstash Forwarder的相关指令,可参阅本教程CentOS版本中的Logstash Forwarder构建与打包章节。
复制SSL证书与Logstash Forwarder软件包
在Logstash服务器上,通过以下命令将SSL证书复制至服务器(将对应部分替换为我们自己的登录信息)
scp /etc/pki/tls/certs/logstash-forwarder.crt user@server_private_IP:/tmp
安装Logstash Forwarder软件包
在服务器上创建Logstash Forwarder源列表:
echo 'deb http://packages.elasticsearch.org/logstashforwarder/debian stable main' | sudo tee /etc/apt/sources.list.d/logstashforwarder.list
接下来通过以下命令利用同样的GPG密钥安装Elasticsearch:
wget -O - http://packages.elasticsearch.org/GPG-KEY-elasticsearch | sudo apt-key add -
而后安装Logstash Forwarder软件包:
sudo apt-get update
sudo apt-get install logstash-forwarder
注意:如果大家使用的是32位版本的Ubuntu并遇到“Unable to locate package logstash-forwarder”错误,则需要以手动方式安装Logstash Forwarder:
wget https://assets.digitalocean.com/articles/logstash/logstash-forwarder_0.3.1_i386.deb
sudo dpkg -i logstash-forwarder_0.3.1_i386.deb
接下来,大家需要安装Logstash Forwarder的init脚本以在引导过程中运行:
cd /etc/init.d/; sudo wget https://raw.githubusercontent.com/elasticsearch/logstash-forwarder/a73e1cb7e43c6de97050912b5bb35910c0f8d0da/logstash-forwarder.init -O logstash-forwarder
sudo chmod +x logstash-forwarder
sudo update-rc.d logstash-forwarder defaults
现在将SSL证书复制到合适的位置(/etc/pki/tls/certs):
sudo mkdir -p /etc/pki/tls/certs
sudo cp /tmp/logstash-forwarder.crt /etc/pki/tls/certs/
配置Logstash Forwarder
在服务器上以JSON格式创建并编辑Logstash Forwarder配置文件:
sudo vi /etc/logstash-forwarder
现在向该文件中添加以下命令行,并将logstash_server_private_IP替换为我们的Logstash服务器私有IP地址:
{
"network": {
"servers": [ "logstash_server_private_IP:5000" ],
"timeout": 15,
"ssl ca": "/etc/pki/tls/certs/logstash-forwarder.crt"
},
"files": [
{
"paths": [
"/var/log/syslog",
"/var/log/auth.log"
],
"fields": { "type": "syslog" }
}
]
}
保存并退出。通过上述配置,Logstash Forwarder将通过端口5000(即我们此前为input指定的端口)接入Logstash服务器,同时使用之前创建的SSL证书。其中paths部分指定的是日志文件的发送位置(在这里我们指定syslog与auth.log),而type部分负责指定日志应为“syslog”类型(即我们filter需要查找的类型)。
需要注意的是,如果大家需要配置Logstash Forwarder将其它日志文件通过端口5000发送至Logstash服务器,也需要在这里添加更多文件/类型。
现在重启Logstash Forwarder并应用各项变更:
sudo service logstash-forwarder restart
Logstash Forwarder开始正确向Logstash服务器发送syslog与auth.log了!在各台需要进行日志收集的服务器上重复以上步骤。
接入Kibana
在完成全部服务器的Logstash Forwarder设置工作后,下面我们可以查看之前安装好的Kibana Web界面了。
在浏览器中访问FQDN或者Logstash服务器的公共IP地址。这时大家应该会看到Kibana的欢迎页面。
点击其中Logstash Dashboard的以访问预生成仪表板。在这里大家可以查看日志事件记录,各日志消息则显示在其下方(如果大家没有看到任何事件或者消息,可能意味着Logstash四大组件中的一种或者多种没有正确配置)。
在这里,大家可以搜索并浏览各项日志信息。我们也可以对仪表板进行自定义。以下为Kibana实例的外观调整示范:
接下来尝试以下几项操作:
搜索“root”以查看是否有人尝试以root身份登录至服务器
搜索特定主机名称
通过在历史记录或者上方菜单中选定区域以变更时间段
点击历史记录下方的消息以查看数据的过滤方式
Kibana还拥有其它多种功能,包括图形化处理与过滤等等,大家可以随意尝试!
总结
现在大家的系统日志已经通过Logstash实现了集中化管理,我们也能够利用Kibana对其进行可视化处理,这意味着各位已经在导入日志并集中管理方面迈出了重要的第一步。请注意,大家可以向Logstash发送多种日志类型,但只有利用grok进行解析及结构化调整之后,信息才会真正具备价值。
另外,我们的Kibana仪表板亦允许任何有权访问服务器的用户接入,因此大家也可以根据需要利用htaccess对其进行保护。