如何在Ubuntu14.04上使用Rsyslog、Logstash和Elasticsearch集中日志

来自菜鸟教程
跳转至:导航、​搜索

Elastic的一篇文章

介绍

理解您的组织生成的数百万条日志行可能是一项艰巨的挑战。 一方面,这些日志行提供了应用程序性能、服务器性能指标和安全性的视图。 另一方面,日志管理和分析可能非常耗时,这可能会阻碍这些日益必要的服务的采用。

rsyslogElasticsearchLogstash 等开源软件提供了传输、转换和存储日志数据的工具。

在本教程中,您将学习如何创建一个集中的 rsyslog 服务器来存储来自多个系统的日志文件,然后使用 Logstash 将它们发送到 Elasticsearch 服务器。 从那里,您可以决定如何最好地分析数据。

目标

本教程教您如何集中 syslog 生成或接收的日志,特别是称为 rsyslog 的变体。 Syslog 和基于 syslog 的工具(如 rsyslog)从内核和许多运行的程序收集重要信息,以保持类 UNIX 的服务器运行。 由于 syslog 是一种标准,而不仅仅是一个程序,因此许多软件项目都支持将数据发送到 syslog。 通过集中这些数据,您可以更轻松地审核安全性、监控应用程序行为并跟踪其他重要的服务器信息。

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

本教程的最终目标是:

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

先决条件

相同的 DigitalOcean 数据中心 中,创建以下启用了 私有网络的 Droplet

  • Ubuntu 14.04 Droplet 名为 rsyslog-client
  • 名为 rsyslog-server 的 Ubuntu 14.04 Droplet(1 GB 或更高版本)将存储集中式日志并安装 Logstash
  • 安装了 Elasticsearch 的 Ubuntu 14.04 Droplet 如何在 Ubuntu 14.04 上安装和配置 Elasticsearch

您还需要对这些服务器中的每一个具有 sudo 权限的非 root 用户。 使用 Ubuntu 14.04 进行初始服务器设置说明了如何设置。

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


有关在创建 Droplet 时启用专用网络的帮助,请参阅 如何设置和使用 DigitalOcean 专用网络

如果您在没有私有网络的情况下创建了 Droplet,请参阅 如何在现有的 Droplets 上启用 DigitalOcean 私有网络

第 1 步 — 确定私有 IP 地址

在本节中,您将确定为每个 Droplet 分配的私有 IP 地址。 本教程将需要此信息。

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

sudo ifconfig -a

-a 选项用于显示所有接口。 主以太网接口通常称为 eth0。 但是,在这种情况下,我们需要来自 eth1 的 IP,即 私有 IP 地址。 这些私有 IP 地址不能通过 Internet 路由,而是用于在私有 LAN 中进行通信——在这种情况下,是通过辅助接口在同一数据中心的服务器之间进行通信。

输出将类似于:

ifconfig -a 的输出

eth0      Link encap:Ethernet  HWaddr 04:01:06:a7:6f:01  
          inet addr:123.456.78.90  Bcast:123.456.78.255  Mask:255.255.255.0
          inet6 addr: fe80::601:6ff:fea7:6f01/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:168 errors:0 dropped:0 overruns:0 frame:0
          TX packets:137 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:18903 (18.9 KB)  TX bytes:15024 (15.0 KB)

eth1      Link encap:Ethernet  HWaddr 04:01:06:a7:6f:02  
          inet addr:10.128.2.25  Bcast:10.128.255.255  Mask:255.255.0.0
          inet6 addr: fe80::601:6ff:fea7:6f02/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:6 errors:0 dropped:0 overruns:0 frame:0
          TX packets:5 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:468 (468.0 B)  TX bytes:398 (398.0 B)

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

这里要注意的部分是 eth1inet addr。 本例中,私网地址为10.128.2.25。 此地址只能从同一区域内启用了专用网络的其他服务器访问。

确保对所有 3 个 Droplet 重复此步骤。 将这些私有 IP 地址保存在安全的地方。 它们将在本教程中使用。

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

作为先决条件的一部分,您在自己的 Droplet 上设置 Elasticsearch。 如何在Ubuntu 14.04上安装和配置Elasticsearch教程教你如何设置绑定地址为localhost,使其他服务器无法访问该服务。 但是,我们需要对此进行更改,以便 Logstash 可以通过其专用网络地址向其发送数据。

我们将 Elasticsearch 绑定到它的私有 IP 地址。 Elasticsearch 只会监听到这个 IP 地址的请求。

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

sudo nano /etc/elasticsearch/elasticsearch.yml

找到包含 network.bind_host 的行。 如果它被注释掉,请通过删除行首的 # 字符来取消注释。 将值更改为 Elasticsearch 服务器的私有 IP 地址,如下所示:

/etc/elasticsearch/elasticsearch.yml

network.bind_host: private_ip_address

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

sudo service elasticsearch restart

警告: 只允许您信任的服务器连接到 Elasticsearch,这一点非常重要。 强烈推荐使用 iptables。 对于本教程,您只想信任运行 Logstash 的 rsyslog-server Droplet 的私有 IP 地址。


第 3 步 — 配置集中式服务器以接收数据

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

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

sudo nano /etc/rsyslog.conf

找到您的 rsyslog.conf 中已注释掉的这些行:

/etc/rsyslog.conf

# provides UDP syslog reception
#$ModLoad imudp
#$UDPServerRun 514

# provides TCP syslog reception
#$ModLoad imtcp
#$InputTCPServerRun 514

每个部分的第一行($ModLoad imudp$ModLoad imtcp)分别加载 imudpimtcp 模块。 imudp 代表 input module udpimtcp 代表 input m模块tcp。 这些模块侦听来自其他系统日志服务器的传入数据。

每个部分的第二行($UDPSerververRun 514$TCPServerRun 514)表示 rsyslog 应该启动相应的 UDP 和 TCP 服务器,以便这些协议在端口 514(这是 syslog 默认端口)上侦听。

要启用这些模块和服务器,请取消注释这些行,以便文件现在包含:

/etc/rsyslog.conf

# provides UDP syslog reception
$ModLoad imudp
$UDPServerRun 514

# provides TCP syslog reception
$ModLoad imtcp
$InputTCPServerRun 514

保存并关闭 rsyslog 配置文件。

通过运行重新启动 rsyslog:

sudo 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 上,编辑默认配置文件:

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

在文件顶部的 log by facility 部分之前添加以下行,将 private_ip_of_ryslog_server 替换为 centralized 服务器的 private IP:

/etc/rsyslog.d/50-default.conf

*.*                          @private_ip_of_ryslog_server:514

保存并退出文件。

该行的第一部分 (.) 表示我们要发送所有消息。 虽然它超出了本教程的范围,但您可以将 rsyslog 配置为仅发送某些消息。 该行的其余部分解释了如何发送数据以及将数据发送到何处。 在我们的例子中,IP 地址前的 @ 符号告诉 rsyslog 使用 UDP 发送消息。 将此更改为 @@ 以使用 TCP。 后面是安装了 rsyslog 和 Logstash 的 rsyslog-server 的私有 IP 地址。 冒号后面的数字是要使用的端口号。

重新启动 rsyslog 以启用更改:

sudo service rsyslog restart

恭喜! 您现在正在将系统日志消息发送到中央服务器!

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


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

Elasticsearch 要求它接收到的所有文档都是 JSON 格式,而 rsyslog 提供了一种通过模板来完成此操作的方法。

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

回到 rsyslog-server 服务器,创建一个新的配置文件,在发送到 Logstash 之前将消息格式化为 JSON 格式:

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

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

/etc/rsyslog.d/01-json-template.conf

template(name="json-template"
  type="list") {
    constant(value="{")
      constant(value="\"@timestamp\":\"")     property(name="timereported" dateFormat="rfc3339")
      constant(value="\",\"@version\":\"1")
      constant(value="\",\"message\":\"")     property(name="msg" format="json")
      constant(value="\",\"sysloghost\":\"")  property(name="hostname")
      constant(value="\",\"severity\":\"")    property(name="syslogseverity-text")
      constant(value="\",\"facility\":\"")    property(name="syslogfacility-text")
      constant(value="\",\"programname\":\"") property(name="programname")
      constant(value="\",\"procid\":\"")      property(name="procid")
    constant(value="\"}\n")
}

除了第一条和最后一条,请注意此模板生成的行的开头有一个逗号。 这是为了维护 JSON 结构 通过整齐排列所有内容来帮助保持文件的可读性。 此模板以 Elasticsearch 和 Logstash 期望接收它们的方式格式化您的消息。 这就是它们的样子:

示例 JSON 消息

{
  "@timestamp" : "2015-11-18T18:45:00Z",
  "@version" : "1",
  "message" : "Your syslog message here",
  "sysloghost" : "hostname.example.com",
  "severity" : "info",
  "facility" : "daemon",
  "programname" : "my_program",
  "procid" : "1234"
}

提示: 如果您想自定义日志数据,rsyslog.com 文档 会显示 rsyslog 中可用的变量。 但是,您必须以 JSON 格式将其发送到 Logstash,然后再发送到 Elasticsearch。


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

第 6 步 — 配置集中式服务器以发送到 Logstash

现在我们有了定义正确 JSON 格式的模板文件,让我们配置集中式 rsyslog 服务器以将数据发送到 Logstash,它位于本教程的同一 Droplet 上。

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

rsyslog-server 上,创建 /etc/rsyslog.d/60-output.conf

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

将以下行复制到此文件:

/etc/rsyslog.d/60-output.conf

# This line sends all lines to defined IP address at port 10514,
# using the "json-template" format template

*.*                         @private_ip_logstash:10514;json-template

开头的 *.* 表示为所有日志消息处理该行的其余部分。 @符号表示使用UDP(使用@@代替TCP)。 @ 之后的 IP 地址或主机名是转发消息的位置。 在我们的例子中,我们使用 rsyslog-server 的私有 IP 地址,因为 rsyslog 集中式服务器和 Logstash 服务器安装在同一个 Droplet 上。 这必须与您配置 Logstash 在下一步中侦听的私有 IP 地址匹配。

接下来是端口号。 本教程使用端口 10514。 请注意,Logstash 服务器必须使用相同的协议侦听相同的端口。 最后一部分是我们的模板文件,它展示了在传递数据之前如何格式化数据。

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

第 7 步 - 配置 Logstash 以接收 JSON 消息

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

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

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

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

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

echo "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 不提供源包。 当您尝试运行 apt-get update 时,这将导致错误。


更新您的软件包列表以包含 Logstash 存储库:

sudo apt-get update

最后,安装 Logstash:

sudo apt-get install logstash

现在已经安装了 Logstash,让我们将其配置为侦听来自 rsyslog 的消息。

Logstash 的默认安装在 /etc/logstash/conf.d 中查找配置文件。 编辑主配置文件:

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

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

/etc/logstash/conf.d/logstash.conf`

# This input block will listen on port 10514 for logs to come in.
# host should be an IP on the Logstash server.
# codec => "json" indicates that we expect the lines we're receiving to be in JSON format
# type => "rsyslog" is an optional identifier to help identify messaging streams in the pipeline.

input {
  udp {
    host => "logstash_private_ip"
    port => 10514
    codec => "json"
    type => "rsyslog"
  }
}

# This is an empty filter block.  You can later add other filters here to further process
# your log lines

filter { }

# This output block will send all events of type "rsyslog" to Elasticsearch at the configured
# host and port into daily indices of the pattern, "rsyslog-YYYY.MM.DD"

output {
  if [type] == "rsyslog" {
    elasticsearch {
      hosts => [ "elasticsearch_private_ip:9200" ]
    }
  }
}

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

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

输入块将 Logstash 配置为侦听端口 10514,因此它不会与同一台机器上的 syslog 实例竞争。 小于 1024 的端口需要以 root 身份运行 Logstash,这不是一个好的安全实践。

请务必将 elasticsearch_private_ip 替换为您的 Elasticsearch Droplet 的 私有 IP 地址 。 输出块显示了一个简单的 条件 配置。 它的目的是只允许匹配事件通过。 在这种情况下,这只是“类型”为“rsyslog”的事件。

测试您的 Logstash 配置更改:

sudo service logstash configtest

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

完成所有这些步骤后,您可以通过运行以下命令启动 Logstash 实例:

sudo service logstash start

还要在同一台服务器上重新启动 rsyslog,因为它现在有一个 Logstash 实例要转发到:

sudo service rsyslog restart

要验证 Logstash 是否正在侦听端口 10514:

netstat -na | grep 10514

您应该看到如下内容:

netstat 的输出

udp6       0      0 10.128.33.68:10514     :::*  

您将看到 rsyslog-server 的私有 IP 地址和我们用来侦听 rsyslog 数据的 10514 端口号。

提示: 要对 Logstash 进行故障排除,请使用 sudo service logstash stop 停止服务并在前台运行并显示详细消息:

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

它将包含常用信息,例如使用 IP 地址和 Logstash 正在使用的 UDP 端口进行验证:

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

第 8 步 - 验证 Elasticsearch 输入

之前,我们将 Elasticsearch 配置为监听其私有 IP 地址。 它现在应该正在接收来自 Logstash 的消息。 在这一步中,我们将验证 Elasticsearch 是否正在接收日志数据。

rsyslog-clientrsyslog-server Droplet 应该将其所有日志数据发送到 Logstash,然后将其传递给 Elasticsearch。 让我们生成一条安全消息来验证 Elasticsearch 确实在接收这些消息。

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

sudo tail /var/log/auth.log

您将在输出末尾看到本地系统上的安全日志。 它看起来类似于:

tail /var/log/auth.log 的输出

May  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
May  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 地址。 此 IP 地址也必须是您在本教程前面配置 Elasticsearch 侦听的地址。

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

在输出中,您将看到类似于以下内容:

卷曲的输出

{
      "_index" : "logstash-2016.05.04",
      "_type" : "rsyslog",
      "_id" : "AVR8fpR-e6FP4Elp89Ww",
      "_score" : 1.0,
      "_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"}
    },

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

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

结论

您的日志现在在 Elasticsearch 中。 下一步是什么? 考虑阅读 Kibana 可以做什么来可视化 Elasticsearch 中的数据,包括折线图和条形图、饼图、地图等。 如何在 Ubuntu 14.04 上使用 Logstash 和 Kibana 集中日志 解释了如何使用 Kibana Web 界面来搜索和可视化日志。

通过进一步解析和标记化,您的数据可能会更有价值。 如果是这样,那么了解有关 Logstash 的更多信息将帮助您实现该结果。