如何在 Ubuntu 14.04 上使用 Rsyslog、Logstash 和 Elasticsearch 集中管理日志

一个文章从 Elastic

介绍

了解您的组织生成的数百万个日志线条可能是一个令人不安的挑战,一方面,这些日志线条提供了应用性能、服务器性能指标和安全性的洞察力,另一方面,日志管理和分析可能耗时,这可能会阻碍这些日益必要的服务的采用。

开源软件,如 rsyslog, Elasticsearch,和 Logstash提供传输,转换和存储您的日志数据的工具。

在本教程中,您将学习如何创建一个集中的 rsyslog 服务器来存储来自多个系统的日志文件,然后使用 Logstash 将其发送到 Elasticsearch 服务器。

目标

这个教程教你如何将 syslog 生成或接收的日志集中起来,具体来说就是被称为 [rsyslog] (http://rsyslog.com)的变体. Syslog,和syslog等基于syslog的工具,从内核和运行的许多程序中收集重要信息,以保持UNIX等服务器运行. 由于syslog是一个标准,而不仅仅是一个程序,许多软件项目都支持向syslog发送数据. 通过集中这些数据,可以更容易地审计安全性,监测应用行为,并跟踪其他重要的服务器信息.

从集中式或汇总的 rsyslog 服务器中,您可以将数据转发到 Logstash,该服务器可以进一步分析和丰富您的日志数据,然后将其发送到 Elasticsearch。

本教程的最终目标是:

  1. 设置一个单一的客户端(或转发) rsyslog 服务器 2. 设置一个单一的服务器(或收集) rsyslog 服务器,从 rsyslog 客户端接收日志 3. 设置一个 Logstash 实例,从 rsyslog 收集服务器接收消息 4. 设置一个 Elasticsearch 服务器,从 Logstash 接收数据

前提条件

在相同的 DigitalOcean 数据中心中,创建以下 Droplets 与 私人网络启用 :

对于每个服务器,您还需要一个具有 sudo 特权的非根用户(Initial Server Setup with Ubuntu 14.04)(https://andsky.com/tech/tutorials/initial-server-setup-with-ubuntu-14-04)解释了如何设置此设置。

注意:为了最大限度地提高性能,Logstash 将默认地尝试分配 1 GB 的内存,以确保集中式服务器实例相应的大小。

请参阅 如何设置和使用DigitalOcean私人网络在创建Dropplets时启用私人网络的帮助。

如果您没有创建私人网络,请参阅 如何在现有 Droplets 上启用数字海洋私人网络

第1步:确定私人IP地址

在本节中,您将确定哪些私人IP地址被分配给每个Droplet。

在每个Droplet上,用ifconfig命令找到其IP地址:

1sudo ifconfig -a

使用-a选项来显示所有接口. 主要的以太网接口通常被称为eth0。 在这种情况下,我们需要从eth1的IP,即private的IP地址。

产量将类似于:

 1[label Output from ifconfig -a]
 2eth0 Link encap:Ethernet HWaddr 04:01:06:a7:6f:01  
 3          inet addr:123.456.78.90 Bcast:123.456.78.255 Mask:255.255.255.0
 4          inet6 addr: fe80::601:6ff:fea7:6f01/64 Scope:Link
 5          UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
 6          RX packets:168 errors:0 dropped:0 overruns:0 frame:0
 7          TX packets:137 errors:0 dropped:0 overruns:0 carrier:0
 8          collisions:0 txqueuelen:1000 
 9          RX bytes:18903 (18.9 KB)  TX bytes:15024 (15.0 KB)
10
11eth1 Link encap:Ethernet HWaddr 04:01:06:a7:6f:02  
12          inet addr:10.128.2.25 Bcast:10.128.255.255 Mask:255.255.0.0
13          inet6 addr: fe80::601:6ff:fea7:6f02/64 Scope:Link
14          UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
15          RX packets:6 errors:0 dropped:0 overruns:0 frame:0
16          TX packets:5 errors:0 dropped:0 overruns:0 carrier:0
17          collisions:0 txqueuelen:1000 
18          RX bytes:468 (468.0 B)  TX bytes:398 (398.0 B)
19
20lo Link encap:Local Loopback  
21          inet addr:127.0.0.1 Mask:255.0.0.0
22          inet6 addr: ::1/128 Scope:Host
23          UP LOOPBACK RUNNING MTU:16436 Metric:1
24          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
25          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
26          collisions:0 txqueuelen:0 
27          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

在此情况下,私人网络地址是 10.128.2.25 . 此地址仅可从具有私人网络启用的同一区域内的其他服务器访问。

一定要重复这个步骤为所有 3 Droplets. 保存这些私人IP地址安全的地方. 他们将被用在整个本教程。

步骤 2 — 为 Elasticsearch 设置绑定地址

作为前提的一部分,你将 Elasticsearch 设置在自己的 Droplet 上。 该教程(https://andsky.com/tech/tutorials/how-to-install-and-configure-elasticsearch-on-ubuntu-14-04)向你展示如何将绑定地址设置为本地主机,以便其他服务器无法访问该服务。 然而,我们需要改变这一点,以便 Logstash 可以通过其私人网络地址发送数据。

我们将Elasticsearch与其私人IP地址联系起来。 **Elasticsearch只会听取向该IP地址的请求。

在 Elasticsearch 服务器上,编辑配置文件:

1sudo nano /etc/elasticsearch/elasticsearch.yml

查找包含「network.bind_host」的行,如果它被评论,请通过在行开头删除「# 」字符来删除评论。

1[label /etc/elasticsearch/elasticsearch.yml]
2network.bind_host: private_ip_address

最后,重新启动 Elasticsearch 以启用更改。

1sudo service elasticsearch restart

使用 iptables是非常建议的。对于本教程,您只想信任 rsyslog-server Droplet的私人IP地址,其中有Logstash在运行。

步骤 3 – 配置集中服务器接收数据

在本节中,我们将配置 rsyslog-server Droplet 作为可在端口 514 上接收其他 syslog 服务器的数据的 centralized 服务器。

要将 rsyslog-server 配置为从其他 syslog 服务器接收数据,请在** rsyslog-server** Droplet 上编辑 `/etc/rsyslog.conf:

1sudo nano /etc/rsyslog.conf

查找在你的rsyslog.conf中已经评论过的这些行:

1[label /etc/rsyslog.conf]
2# provides UDP syslog reception
3#$ModLoad imudp
4#$UDPServerRun 514
5
6# provides TCP syslog reception
7#$ModLoad imtcp
8#$InputTCPServerRun 514

每个部分的第一个行(‘$ModLoad imudp’和‘$ModLoad imtcp’)分别加载imudpimtcp模块,而imudp代表i**nput** m** odule** udp** ,imtcp代表i** nput** m** module** tcp**

每个部分的第二行()表示 rsyslog 应该在端口 514 (即 syslog 默认端口) 上启动这些协议的相应 UDP 和 TCP 服务器。

要启用这些模块和服务器,请删除这些行,以便该文件现在包含:

1[label /etc/rsyslog.conf]
2# provides UDP syslog reception
3$ModLoad imudp
4$UDPServerRun 514
5
6# provides TCP syslog reception
7$ModLoad imtcp
8$InputTCPServerRun 514

保存并关闭 rsyslog 配置文件。

重启 rsyslog 运行:

1sudo service rsyslog restart

您的集中的 rsyslog 服务器现在已配置为收听远程 syslog (包括 rsyslog) 实例的消息。

提示:**要验证您的 rsyslog 配置文件,您可以运行 sudo rsyslogd -N1 命令。

步骤 4 — 配置 rsyslog 以远程发送数据

在本节中,我们将配置 rsyslog-client 以将日志数据发送到我们在最后一步中配置的** ryslog-server** Droplet。

在 Ubuntu 的默认 rsyslog 设置中,您将在 `/etc/rsyslog.d 中找到两个文件:

  • 20-ufw.conf * 50-default.conf

rsyslog-client 上,编辑默认配置文件:

1sudo nano /etc/rsyslog.d/50-default.conf

基于设施的日志部分之前,在文件顶部添加下列行,将private_ip_of_ryslog_server替换为您的集中服务器的 private IP:

1[label /etc/rsyslog.d/50-default.conf]
2*.*							@private_ip_of_ryslog_server:514

保存和退出文件。

该行的第一部分 (.) 表示我们要发送所有消息. 虽然它不属于此教程的范围, 但您可以配置 rsyslog 只发送某些信件 。 该行的其余部分解释了如何发送数据以及何处发送数据. 在我们的情况下,IP地址前的QQ符号告诉rsyslog使用UDP发送消息. 将此修改为QQ, 以使用 TCP 。 接下来是rsyslog-server 的私人IP地址,上面安装了rsyslog和Logstash. 冒号后的数字为要使用的端口数字.

重新启动 rsyslog 以启用更改:

1sudo service rsyslog restart

恭喜您!您现在正在向集中式服务器发送您的 syslog 消息!

提示:**要验证您的 rsyslog 配置文件,您可以运行 sudo rsyslogd -N1 命令。

第5步:将日志数据格式化为JSON

Elasticsearch 要求它所接收的所有文档都以 JSON 格式, rsyslog 提供了通过模板来实现这一点的方法。

在此步骤中,我们将配置我们的集中 rsyslog 服务器以使用 JSON 模板来格式化日志数据,然后将其发送到 Logstash,然后将其发送到另一台服务器上的 Elasticsearch。

rsyslog-server 服务器上,创建一个新的配置文件,以将消息格式为JSON格式,然后发送到Logstash:

1sudo nano /etc/rsyslog.d/01-json-template.conf

将以下内容复制到文件中,如下所示:

 1[label /etc/rsyslog.d/01-json-template.conf]
 2template(name="json-template"
 3  type="list") {
 4    constant(value="{")
 5      constant(value="\"@timestamp\":\"")     property(name="timereported" dateFormat="rfc3339")
 6      constant(value="\",\"@version\":\"1")
 7      constant(value="\",\"message\":\"")     property(name="msg" format="json")
 8      constant(value="\",\"sysloghost\":\"")  property(name="hostname")
 9      constant(value="\",\"severity\":\"")    property(name="syslogseverity-text")
10      constant(value="\",\"facility\":\"")    property(name="syslogfacility-text")
11      constant(value="\",\"programname\":\"") property(name="programname")
12      constant(value="\",\"procid\":\"")      property(name="procid")
13    constant(value="\"}\n")
14}

除了第一个和最后一个,请注意,由此模板产生的行在它们开始时有一个字符串。这就是为了保持 JSON 结构 and 帮助保持文件可读性,通过整洁地排列一切。

 1[label Example JSON message]
 2{
 3  "@timestamp" : "2015-11-18T18:45:00Z",
 4  "@version" : "1",
 5  "message" : "Your syslog message here",
 6  "sysloghost" : "hostname.example.com",
 7  "severity" : "info",
 8  "facility" : "daemon",
 9  "programname" : "my_program",
10  "procid" : "1234"
11}

<$>[注] 提示: rsyslog.com docs显示从rsyslog可用的变量,如果你想定制日志数据,但是,你必须将其发送到JSON格式到Logstash,然后到Elasticsearch。

正在发送的数据尚未使用此格式,下一步是配置服务器使用此模板文件。

步骤 6 — 配置集中服务器发送到 Logstash

现在我们已经有了定义适当的JSON格式的模板文件,让我们配置集中式rsyslog服务器将数据发送到Logstash,这在本教程的同一Droplet上。

在启动时,rsyslog 会查看 `/etc/rsyslog.d 中的文件,并从中创建其配置. 让我们添加自己的配置文件来扩展配置。

在 **rsyslog 服务器上,创建 /etc/rsyslog.d/60-output.conf:

1sudo nano /etc/rsyslog.d/60-output.conf

将下列行复制到此文件:

1[label /etc/rsyslog.d/60-output.conf]
2# This line sends all lines to defined IP address at port 10514,
3# using the "json-template" format template
4
5*.*							@private_ip_logstash:10514;json-template

最初的)。在@之后的IP地址或主机名称是发送消息的地方。在我们的情况下,我们正在使用rsyslog-server的私人IP地址,因为rsyslog集中服务器和Logstash服务器安装在同一个Dropplet上。

端口号是下一个。本教程使用端口10514. 请注意,Logstash服务器必须使用相同的协议在相同的端口上聆听。

不要重新启动 rsyslog. 首先,我们必须配置 Logstash 来接收消息。

步骤 7 — 配置 Logstash 接收 JSON 消息

在此步骤中,您将安装 Logstash,将其配置为从 rsyslog 接收 JSON 消息,并将其配置为将 JSON 消息发送到 Elasticsearch。

Logstash 需要 Java 7 或更高版本。 使用 Elasticsearch 教程中的 步骤 1 的说明,在** rsyslog-server** Droplet 上安装 Java 7 或 8。

接下来,安装 Logstash 存储库的安全密钥:

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

将库定义添加到您的 /etc/apt/sources.list 文件中:

1echo "deb http://packages.elastic.co/logstash/2.3/debian stable main" | sudo tee -a /etc/apt/sources.list

<$>[注] 注: 使用上文所描述的echo方法添加 Logstash 存储库. 不要使用add-apt-repository,因为它也会添加一个deb-src条目,但Elastic 不会提供源包。

更新您的包列表以包括 Logstash 存储库:

1sudo apt-get update

最后,安装Logstash:

1sudo apt-get install logstash

现在Logstash已安装,让我们将其配置为收听rsyslog的消息。

Logstash 的默认安装在 `/etc/logstash/conf.d 中寻找配置文件。

1sudo nano /etc/logstash/conf.d/logstash.conf

然后将这些行添加到 /etc/logstash/conf.d/logstash.conf:

 1[label /etc/logstash/conf.d/logstash.conf`]
 2# This input block will listen on port 10514 for logs to come in.
 3# host should be an IP on the Logstash server.
 4# codec => "json" indicates that we expect the lines we're receiving to be in JSON format
 5# type => "rsyslog" is an optional identifier to help identify messaging streams in the pipeline.
 6
 7input {
 8  udp {
 9    host => "logstash_private_ip"
10    port => 10514
11    codec => "json"
12    type => "rsyslog"
13  }
14}
15
16# This is an empty filter block. You can later add other filters here to further process
17# your log lines
18
19filter { }
20
21# This output block will send all events of type "rsyslog" to Elasticsearch at the configured
22# host and port into daily indices of the pattern, "rsyslog-YYYY.MM.DD"
23
24output {
25  if [type] == "rsyslog" {
26    elasticsearch {
27      hosts => [ "elasticsearch_private_ip:9200" ]
28    }
29  }
30}

syslog 协议定义为 UDP,因此此配置反映了该标准。

在输入块中,通过替换logstash_private_ip 以 rsyslog-server 的私有 IP 地址来设置 Logstash 主机地址,其中也安装了 Logstash。

输入区块将Logstash配置为在端口10514上聆听,这样它就不会与同一台机器上的syslog实例竞争。

请务必用您的 Elasticsearch Droplet 的 私人 IP 地址 代替 elasticsearch_private_ip。 输出块显示一个简单的(https://www.elastic.co/guide/en/logstash/current/event-dependent-configuration.html# conditionals)配置。 它的目的是仅允许通过匹配事件。 在这种情况下,这只是rsyslog类型的事件。

测试您的 Logstash 配置更改:

1sudo service logstash configtest

如果没有语法错误,它应该显示配置OK。否则,请尝试阅读错误输出,看看您的 Logstash 配置有什么不对劲。

完成所有这些步骤后,您可以通过运行运行您的 Logstash 实例:

1sudo service logstash start

此外,在相同的服务器上重新启动 rsyslog,因为它有一个 Logstash 实例可以转发到现在:

1sudo service rsyslog restart

要验证 Logstash 是否在端口 10514 上收听:

1netstat -na | grep 10514

你应该看到这样的东西:

1[label Output of netstat]
2udp6 0 0 10.128.33.68:10514     :::*

您将看到 rsyslog 服务器的私人 IP 地址和 10514 端口号,我们正在使用它来收听 rsyslog 数据。

<$>[注] 提示: 若要解决 Logstash 问题,请用sudo service logstash stop关闭该服务,并在前面运行它,使用无语音消息:

1/opt/logstash/bin/logstash -f /etc/logstash/conf.d/logstash.conf --verbose

它将包含常见信息,如通过 IP 地址和 UDP 端口验证 Logstash 正在使用:

1Starting UDP listener {:address=>"10.128.33.68:10514", :level=>:info}

美元

第8步:验证 Elasticsearch 输入

此前,我们已经配置了 Elasticsearch 来收听其私人 IP 地址,现在它应该接收来自 Logstash 的消息,在此步骤中,我们将验证 Elasticsearch 是否接收日志数据。

rsyslog-client 和** rsyslog-server** Droplets 应该将所有日志数据发送到 Logstash,然后将其传送到 Elasticsearch。

rsyslog-client 上,执行以下命令:

1sudo tail /var/log/auth.log

您将在输出的末尾看到本地系统上的安全日志,它将看起来像:

1[label Output of tail /var/log/auth.log]
2May 2 16:43:15 rsyslog-client sudo:    sammy : TTY=pts/0 ; PWD=/etc/rsyslog.d ; USER=root ; COMMAND=/usr/bin/tail /var/log/auth.log
3May 2 16:43:15 rsyslog-client sudo: pam_unix(sudo:session): session opened for user root by sammy(uid=0)

通过一个简单的查询,您可以检查Elasticsearch:

在 Elasticsearch 服务器上或允许访问它的任何系统上运行以下命令. 用 Elasticsearch 服务器的私人 IP 地址替换 elasticsearch_ip。

1curl -XGET 'http://elasticsearch_ip:9200/_all/_search?q=*&pretty'

在输出中,你会看到类似于以下的东西:

1[label Output of curl]
2{
3      "_index" : "logstash-2016.05.04",
4      "_type" : "rsyslog",
5      "_id" : "AVR8fpR-e6FP4Elp89Ww",
6      "_score" : 1.0,
7      "_source":{"@timestamp":"2016-05-04T15:59:10.000Z","@version":"1","message":"    sammy : TTY=pts/0 ; PWD=/home/sammy ; USER=root ; COMMAND=/usr/bin/tail /var/log/auth.log","sysloghost":"rsyslog-client","severity":"notice","facility":"authpriv","programname":"sudo","procid":"-","type":"rsyslog","host":"10.128.33.68"}
8    },

请注意,生成 rsyslog 消息的 Droplet 名称位于日志中(rsyslog-client )。

通过这个简单的验证步骤,您的集中 rsyslog 设置是完整的,完全可操作的!

结论

你的日志现在在弹性搜索中 接下来呢? 考虑读取 Kibana 所能做的,以可视化您在Elasticsearch中掌握的数据,包括行图和条图,派图,地图等等. [How To use Logstash and Kibana to Centralization Logs On Ubuntu 14.04] (https://andsky.com/tech/tutorials/how-to-use-logstash-and-kibana-to-centralize-and-visualize-logs-on-ubuntu-14-04# connect-to-kibana)解释如何使用Kibana网络界面搜索和可视化日志.

如果是这样,那么了解更多关于 Logstash将帮助您实现这一结果。

Published At
Categories with 技术
comments powered by Disqus