Logstash教程:Linux Central日志服务器
每当体系结构中的任何组件出现问题时,系统管理员要做的第一件事就是检查与该应用程序相关的日志。
因为日志可以为我们提供有关该应用程序所面临的问题的见解。
如果我们只负责处理少数几个在其上运行的服务器和应用程序,则只需转到grep日志以收集信息即可。
但是,请设想一下这样一种情况:我们有数百台服务器,并且它们上运行的应用程序类型非常不同。
在这种情况下,我们无法运行 tail,然后运行grep甚至无法以所需的方式使用awk格式化输出。
尽管学习用awk格式化输出格式的技巧是一件好事,但是这并不能满足我们进行故障排除的目的,并且在数百台服务器上进行同样的操作会花费数小时的时间。
可以通过使用中央日志记录服务器来解决该问题。
但是,即使我们有一台中央日志记录服务器,也只能将所有日志汇总到一个位置,但是仍然要对所有日志进行排序并在灾难期间查找问题,这是一场噩梦。
最好有一个中央日志服务器,其中收集所有应用程序和系统日志,同时我们需要一个良好的界面,该界面将对日志中的不同字段进行过滤和排序,并在Web界面中填充所有这些字段。
下面提到的是我们需要完成的一些点,以实现简单但有效且可扩展的日志管理。
- 一站式整合日志
- 解析日志(这样我们就无需运行tail,grep或者awk对输出进行排序)
- 存储和轻松搜索。
幸运的是,有可用的开源工具可以帮助我们解决问题。
该工具称为logstash。
Logstash是免费的,也是开源的,并根据Apache 2许可发布。
Logstash是用于Linux的非常有效的日志管理解决方案。
主要的添加优点是,logstash可以从以下位置收集日志输入。
- Windows事件日志
- 系统日志
- TCP/UDP
- 文件(这意味着任何不属于syslog的自定义日志文件,应用程序将在该日志文件中发送日志数据)
- 标准输入
上面显示的位置几乎涵盖了基础架构可以拥有的所有日志位置。
Logstash用Jruby编写。
而且它需要我们计算机上的Java才能运行。
我们的logstash日志管理工具内部有5个重要组件。
让我们看看那些。
- 一个远程的发件人组件,它将位于所有代理上(客户端/服务器会将其日志发送到我们的中央logstash服务器)
- 搜索和存储数据
- Web界面(我们可以在指定的时间范围内搜索和查看日志详细信息)
- 索引器(这将从远程代理接收日志数据并对其进行索引,以便我们以后可以搜索它们)
- 代理(这将从不同的代理接收日志事件数据,即远程服务器)
Logstash体系结构图如下所示。
该图包含了我们上面提到的所有组件。
如何安装和配置Logstash?
现在,让我们继续并使用logstash安装我们的中央日志记录服务器。
为了向我们展示此示例配置,我将使用Ubuntu-12.04 Server。
我其中一种运行着各种不同应用程序的体系结构中使用了完全相同的配置。
其中一些是专有的,而另一些则是开源的。
我在Amazon AWS中运行此配置,并且我的logstash服务器使用Amazon s3作为其存储。
为了向我们展示此示例教程,我们将使用本地系统进行存储。
Logstash是一个非常易于扩展的开源工具。
我们可以分离每个组件,以便轻松扩展。
就本教程而言,我们将所有组件都放在一个中央服务器中。
运行logstash中央服务器的主要前提条件是必须安装Java。
因为logstash在Java虚拟机内部运行。
因此,让我们看看如何在我们的Ubuntu系统上安装Java。
请记住,尽管在Ubuntu计算机上向我们显示了此示例配置,我们也可以使用相同的方法在centos/redhat系统内配置logstash(当然,我们需要用替换apt-get这样的Ubuntu特定命令)在redhat/centos环境中配置时的yum。
)
因此,首先让我们在中央Logstash服务器上安装Java JDK。
root@ubuntu-dev:~# apt-get install openjdk-7-jdk
安装JDK后,可以使用以下命令进行确认。
root@ubuntu-dev:~# java -version
现在,让我们创建一个目录,其中放置logstash Java文件。
为应用程序创建新目录总是更好,以免造成混淆,而且会使它看起来更整洁。
我们将有三个目录。
一个将保存logstash应用程序,另一个将保存配置文件,而第三个将保存记录为logstash本身的日志。
root@ubuntu-dev:~# mkdir /opt/logstash root@ubuntu-dev:~# mkdir /etc/logstash root@ubuntu-dev:~# mkdir /var/log/logstash
请注意,并不需要完全在同一位置创建logstash文件夹。
我们可以在任何地方创建logstash文件夹。
或者,如果我们希望完全不使用任何文件夹,则可以执行此操作。
唯一的目的是以结构化的方式组织不同的文件。
现在,进入我们的logstash应用程序目录,并使用wget命令从其官方下载logstash Java jar文件。
可以如下所示进行。
root@ubuntu-dev:~# cd /opt/logstash/ root@ubuntu-dev:/opt/logstash# wget https://download.elasticsearch.org/logstash/logstash/logstash-1.2.2-flatjar.jar root@ubuntu-dev:~# mv logstash-1.2.2-flatjar.jar logstash.jar
我们刚刚下载的jar文件甚至包含代理和服务器。
现在请记住一件事,就考虑logstash服务器和代理而言,程序包(jar文件)没有区别。
区别只是我们配置它的方式。
logstash服务器将使用服务器特定的配置运行该相同的jar文件,logstash代理将使用发货人特定的配置运行该相同的jar文件。
我们现在需要安装代理。
如果我们还记得体系结构图,logstash服务器上的代理会接收不同服务器发送的日志数据。
因此,拥有代理的想法是在logstash索引索引之前保存代理发送的日志数据。
拥有代理将提高logstash服务器的性能。
我们可以使用下面提到的任何经纪人。
- Redis服务器
- AMQP(高级消息队列协议)
- ZeroMQ
我们将使用第一个代理作为我们的代理,因为它很容易配置。
因此,我们的经纪人将是一个redis服务器。
让我们继续通过以下命令安装redis服务器。
root@ubuntu-dev:~# apt-get install redis-server
如果我们使用的是centos/redhat发行版,请首先安装EPEL Yum存储库,以安装最新版本的redis。
Redis充当日志数据的缓冲区,直到logstash将其索引并存储为止。
由于它在内存中太快了
现在,我们需要修改redis配置文件,以便它将侦听所有接口,而不仅是本地主机127.0.0.1.
这可以通过在redis配置文件/etc/redis/redis.conf中注释掉以下行来完成。
#bind 127.0.0.1
现在,通过以下命令重新启动redis服务器。
root@logstash-dev-qa:~# /etc/init.d/redis-server restart
现在,我们的Redis服务器在所有网络接口上进行侦听。
并准备从远程服务器接收日志数据。
为了测试redis配置,redis软件包随附了一个工具。
它称为redis-cli。
默认情况下,Redis监听端口号为6379.
redis-cli命令将默认尝试连接到该端口。
通过使用redis-cli命令连接到我们的redis服务器实例,然后发出命令“ PING”,可以测试redis服务器。
如果一切顺利,我们应该获得“ PONG”的输出
root@ubuntu-dev:~$redis-cli -h 192.168.0.101 redis 192.168.0.101:6379> PING PONG
我们也可以通过简单地从任何远程服务器远程登录到端口6379来发出相同的PING命令。
现在我们的redis经纪人已经准备好了。
但是还有一件主要的事情要在我们的logstash服务器上进行配置。
它是搜索和索引工具。
中央日志服务器的主要目标是在一个地方收集所有日志,此外,它还应提供一些有意义的数据进行分析。
就像我们应该能够在指定时间段内搜索特定应用程序的所有日志数据。
因此,我们的logstash服务器上必须具有搜索和良好索引功能。
为此,我们将安装另一个名为elasticsearch的开源工具。
Elasticsearch使用一种机制来建立索引,然后搜索该索引以使其更快。
它是一种用于文本数据的搜索引擎。
默认情况下,Easticsearch在集群模型中工作。
即使我们有一个elasticsearch节点,它也仍然是我们在其配置文件中定义的集群的一部分(就像在我们的例子中,我们将只有一个elasticsearch节点,它将成为集群的一部分)。
这样做是为了轻松实现可伸缩性。
将来如果我们需要更多的Elasticsearch节点,我们可以简单地添加另一个Linux主机,并在其Elasticsearch配置内部指定具有节点地址的相同集群名称。
诸如Elasticsearch和Redis之类的工具本身就是一个大话题,在本教程中,我无法对其进行详细讨论(因为本教程的主要目的是使中央日志服务器能够准备好并运行Logstash)。
对此感到抱歉。
但是,我肯定会在我们即将发布的帖子中包括与Redis和elasticsearch相关的教程。
现在,让我们继续并在我们的logstash服务器上安装elasticsearch。
安装elasticsearch的主要前提条件是Java,我们已经在上一节中安装了Java。
Elasticsearch可以从以下位置下载。
下载Elasticsearch
当我们在Ubuntu机器上设置Logstash中央服务器时,我们将下载elasticsearch的Debian软件包。
如果我们访问elasticsearch下载页面,则还可以获得RPM,tar.gz软件包。
让我们使用wget命令在Logstash服务器上下载debian软件包,如下所示。
root@ubuntu-dev:~# wget https://download.elasticsearch.org/elasticsearch/elasticsearch/elasticsearch-0.90.7.deb
下一步是简单地继续操作,并使用dpkg命令安装elasticsearch,如下所示。
root@ubuntu-dev:~# dpkg -i elasticsearch-0.90.7.deb
安装elasticsearch后,默认情况下该服务应自动启动。
如果我们没有启动elasticsearch服务,那么我们始终可以使用以下命令进行操作。
root@ubuntu-dev:-#/etc/init.d/elasticsearch start
如果我们还记得的话,我之前曾说过Elasticsearch总是以集群的形式工作。
即使我们只有一个节点群集。
安装elasticsearch并启动它,默认情况下将使其在某些集群中运行。
我们可以通过访问elasticsearch配置文件/etc/elasticsearch/elasticsearch.yml来找到当前集群名称。
我们可以在elasticsearch yml配置文件中找到以下两行。
#cluster.name: elasticsearch #node.ame: "Franz Kafka"
默认情况下,以上两行都将被注释掉。
我们需要取消注释,并使用所需名称重命名集群。
为了显示此示例,我们将弹性搜索集群命名为“ logstash”。
还要用我们想要的名称重命名该节点。
具有相同群集名称的任何其他将来节点都将成为该群集的一部分。
重命名完成后,请通过前面显示的命令重新启动elasticsearch服务,以使更改生效。
默认情况下,Elasticsearch运行在端口9200上。
我们可以通过浏览网页<IP地址>:9200来再次检查。
我们应该在该URL上获得一些状态以及其他版本详细信息。
现在,我们已经在Logstash中央日志记录服务器上提供了三个主要组件。
第一个是我们的代理,它是redis服务器,第二个是logstash java jar文件,第三个是称为弹性搜索的索引和搜索工具。
但是我们还没有告诉我们的logstash服务器(基本上是我们之前下载的一个简单的jar文件,并保存在/opt/logstash /中)关于我们的代理和elasticsearch的信息。
我们首先需要在我们创建的/etc/logstash目录中为logstash创建一个配置文件,并描述这两个组件(elastisearch和redis)。
准备好用于描述这些组件的配置文件后,就可以使用/opt/logstash /中的jar文件启动logstash服务器。
在启动logstash服务器时,我们将提供配置文件,该文件位于/etc/logstash内作为参数。
我们还需要提供一个记录日志记录服务器事件的日志记录位置(这是常规的/var/log/logstash文件夹。
)
请不要将/var/log/logstash目录与我们的logstash服务器将使用的中央日志记录位置混淆。
来自所有不同服务器的日志将存储在elasticsearch存储位置内。
我们将在一段时间后看到。
我们可以根据需要命名logstash配置文件。
无论我们提供什么名称都没有关系,但是在启动Logstash服务器时,只需简单地将该文件作为参数传递即可。
我们的中央logstash配置文件如下所示。
我们将调用logstash服务器配置文件server.conf。
在/etc/logstash /中创建一个名为server.conf的文件,然后将以下内容复制粘贴到其中。
input { redis { host => "192.168.0.106" type => "redis" lending experience data_type => "list" key => "logstash" } } output { stdout { } elasticsearch { cluster => "logstash" } }
Logstash在其配置内部具有不同块的概念。
它具有输入块,该块告诉从何处获取输入。
还有一个输出块,该块告诉将输出提供给存储和索引的位置。
我们的输入和输出块很容易理解。
它说从192.168.0.106(这是我们的主机本身)上的redis实例获取输入,redis中发现的所有logstash都将其标记为“ logstash”。
处理来自redis输入的数据后,将它们提供给名为“ logstash”的elasticserach群集以进行存储和搜索。
我们可能会想,logstash如何理解我们在创建server.conf文件时描述的这些语言。
它如何理解什么是Elasticsearch,如何理解什么是Redis等。
不用担心,logstash jar文件(运行logstash所需的单个组件)了解这些不同类型的代理以及输入和输出类型。
现在,我们的主要logstash中央服务器配置文件已准备就绪。
让我们继续使用/opt/logstash /目录中的jar文件来启动我们的logstash服务。
我们可以通过以下命令启动logstash。
#java -jar /opt/logstash/logstash.jar agent -v -f /etc/logstash/server.conf --log /var/log/logstash/server.log
尽管我们可以使用上面显示的命令启动logstash服务器。
启动/停止/重新启动logstash服务的更好方法是为其创建一个初始化脚本。
在下面的github位置已经有一个不错的用于logstash的初始化脚本。
根据配置文件名修改脚本,它应该可以工作。
Logstash初始化脚本以启动和停止服务
如果我们无法通过上面的init脚本使它起作用,请通过注释让我知道。
现在,我们有两个任务待处理。
一种是用于logstash的kibana Web界面。
第二个是配置我们的第一个代理(客户端服务器)以将日志发送到我们的中央logstash服务器。
如何为Logstash配置Kibana Web界面?
logstash预先装有kibana控制台。
可以通过以下命令启动默认的kibana控制台。
并记住我之前所说的事实。
运行logstash所需的所有组件都已预先构建在我们下载的单个jar文件中。
因此,带有kibana的Web组件也可以通过使用logstash.jar文件启动,如下所示。
#java -jar /opt/logstash/logstash.jar web
但是,配置kibana控制台的一种更好的方法是让nginx Web服务器与带有kibana控制台的文档根一起运行。
因此,要使用nginx运行kibana,我们需要先安装nginx。
正如我们在ubuntu 12.04服务器中执行所有这些操作一样,只需一个命令即可安装nginx。
#apt-get install nginx
如果我们使用的是基于Red Hat或者centos的发行版,则可以按照以下信息安装nginx。
阅读:如何在Red Hat和Centos中安装Nginx Web服务器
现在,我们已经安装了nginx Web服务器,我们需要首先下载可以使用nginx提供服务的kibana软件包。
可以通过使用带有URL的wget命令来完成此操作,如下所示。
请在nginx doc根目录下下载以下文件(默认情况下ubuntu nginx doc根目录位于/usr/share/nginx /)
#wget https://github.com/elasticsearch/kibana/archive/master.zip
解压缩下载的文件,然后更改nginx的默认文档根目录(只需修改文件/etc/nginx/sites-available/default,然后替换指向我们刚刚解压缩的kibana主文件夹的root指令。
)到我们新解压缩的kibana主目录中。
默认情况下,我们为nginx下载的kibana控制台程序包将尝试连接到localhost上的elasticsearch。
因此,不需要修改。
重新启动nginx并将浏览器指向服务器IP,它将带我们到默认的kibana logstash控制台。
如何配置logstash代理以将日志发送到我们的logstash中央服务器?
现在让我们看看剩下的第二件事。
我们需要配置我们的第一个代理以将日志发送到新安装的logstash服务器。
非常简单。
我概述了以下配置第一个Logstash代理的步骤。
步骤1
创建我们为logstash中央服务器所做的确切目录结构,如下所示。
因为对于代理,我们还需要/etc/logstash中的配置文件,/var/log/logstash中的日志文件和/opt/logstash /中的logstash主jar文件。
root@ubuntu-agent:~# mkdir /opt/logstash root@ubuntu-agent:~# mkdir /etc/logstash root@ubuntu-agent:~# mkdir /var/log/logstash
第2步
下载logstash jar文件(与用于logstash服务器的jar文件相同)并将其放置在目录/opt/logstash中(正如我在本文开头所讲的那样,目录结构只是为了更好地组织它。
我们可以将配置文件,jar文件放在我们想要的位置。
)
root@ubuntu-agent:~# cd /opt/logstash/ root@ubuntu-agent:/opt/logstash# wget https://download.elasticsearch.org/logstash/logstash/logstash-1.2.2-flatjar.jar root@ubuntu-agent:~# mv logstash-1.2.2-flatjar.jar logstash.jar
第三步
为我们的代理创建配置文件。
这部分略有不同。
这里的输入将是文件(我们要发送到中央日志服务器的日志文件),输出将是安装在中央logstash服务器上的redis代理。
输入块将包含需要发送到我们的中央logstash服务器的文件列表(任何应用程序的日志文件,甚至是syslog)。
让我们看一下代理配置文件的外观。
在/etc/logstash /中创建一个文件,命名为shipper.conf或者说agent.conf或者我们喜欢的任何名称。
内容应如下所示。
input { file { type => "syslog" path => ["/var/log/auth.log", "/var/log/syslog"] exclude => ["*.gz", "shipper.log"] } } output { stdout { } redis { host => "192.168.0.106" data_type => "list" key => "logstash" } }
如果我们看到了,请将我的/var/log/auth.log和/var/log/syslog发送到我们的中央Logstash服务器。
另外,如果我们看到输出块,我们会将这些数据发送到192.168.0.106上的redis服务器(这是我们安装的中央Logstash服务器。
将其替换为中央Logstash服务器ip地址)。
请记住,中央Logstash服务器上的输入块是Redis。
因此,无论代理发送到redis的什么,logstash中央服务器都会从redis收集它,并将过滤后的数据返回给elasticsearch(因为中央服务器上的输出块是elasticsearch)
由于我们已准备好Logstash代理进行配置,因此最好使用类似于Logstash中央服务器的初始化脚本来启动和停止该代理。
Logstash代理的初始化脚本可以在下面的相同githup位置找到。
有关logstash代理程序初始化脚本,请参考以下URL中的运货商部分。
请适当修改配置文件许可以适合配置文件。
Logstash代理初始化脚本
现在,我们的第一个代理正在将日志数据发送到我们的中央日志服务器。
现在,我们应该能够看到这些消息出现在我们在中央Logstash服务器上配置的Kibana控制台上。
请导航到默认的logstash仪表板。
尽管我们现在为我们的体系结构提供了一个中央日志服务器,该服务器从不同的代理接收日志,但是我们收集的数据并不理想。
因为我们只是将日志从代理转发到中央服务器,所以即使kibana在Web界面中向我们显示了数据,该数据也没有意义并且对于分析而言足够好。
如果我们还记得我们拥有一个像logstash这样的中央日志服务器的主要目的,不仅是将所有日志存储在一个地方,它的目的是摆脱对这些日志消息进行tail,grep和awk的操作。
因此,我们需要过滤要发送到中央服务器的数据,以便kibana可以向我们显示一些有意义的数据。
让我们以DNS查询日志为例。
查询日志如下所示。
20-Nov-2013 06:55:49.946 client 192.168.0.103#40622: query: www.yahoomail.com IN A + (192.168.0.134)
我们需要过滤上面显示的日志,然后再将其发送到logstash服务器。
当我说过滤时,这意味着我们需要告诉该日志消息中的每个字段是什么。
什么是第一个字段,什么是第二个字段等。
因此,每当我想进行故障排除并找出今天上午10点至11点之间的dns查询时,是什么。