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

介绍

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

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

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

要完成本教程,你需要具备以下内容:

  • 一台已经设置好可以使用sudo命令的非root账号的Ubuntu服务器,并且已开启防火墙。没有服务器的同学可以在这里购买,不过我个人更推荐您使用免费的腾讯云开发者实验室进行试验,学会安装后再购买服务器
  • 一个日志分析系统。您可以使用腾讯云容器服务,他提供了比较完整的日志分析系统。腾讯云容器服务基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务。腾讯云容器服务完全兼容原生 kubernetes API ,扩展了腾讯云的 CBS、CLB 等 kubernetes 插件,为容器化的应用提供高效部署、资源调度、服务发现和动态伸缩等一系列完整功能,解决用户开发、测试及运维过程的环境一致性问题,提高了大规模容器集群管理的便捷性,帮助用户降低成本,提高效率。容器服务提供免费使用,涉及的其他云产品另外单独计费。

目标

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

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

本教程的最终目标是:

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

先决条件

同一个DigitalOcean数据中心中,创建以下启用专用网络的 Droplet :

  • Ubuntu 14.04 Droplet命名为rsyslog-client
  • Ubuntu 14.04 Droplet(1 GB或更高)命名为rsyslog-server,用于存储集中日志并安装Logstash
  • 安装有 Elasticsearch的Ubuntu 14.04 Droplet

您还需要一个对每个服务器都具有sudo权限的非root用户。

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

第1步 - 确定专用IP地址

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

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

sudo ifconfig -a

-a选项用于显示所有接口。主以太网接口通常名为eth0。在这种情况下,但是,我们希望IP 从eth1这个私有 IP地址。这些专用IP地址不能通过Internet路由,并且用于在专用LAN中进行通信 - 在这种情况下,通过辅助接口在同一数据中心的服务器之间进行通信。

输出看起来类似于:

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)

这里要注意的部分是inet addreth1内部。在这种情况下,专用网络地址是10.128.2.25。此地址只能从同一区域内启用了专用网络的其他服务器访问。

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

第2步 - 设置Elasticsearch的绑定地址

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

我们将Elasticsearch绑定到其私有IP地址。Elasticsearch只会侦听对此IP地址的请求。

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

sudo nano /etc/elasticsearch/elasticsearch.yml

找到包含network.bind_host的行。如果已注释掉,则通过删除行开头的#字符取消注释。将值更改为Elasticsearch服务器的专用IP地址,使其如下所示:

network.bind_host: private_ip_address

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

sudo service elasticsearch restart

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

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

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

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

sudo nano /etc/rsyslog.conf

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

# provides UDP syslog reception
#$ModLoad imudp
#$UDPServerRun 514
​
# provides TCP syslog reception
#$ModLoad imtcp
#$InputTCPServerRun 514

每个部分的第一行($ModLoad imudp$ModLoad imtcp)分别加载imudpimtcp模块。imudp代表输入模块UDP,而imtcp代表输入模块TCP。这些模块侦听来自其他syslog服务器的传入数据。

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

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

# 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替换为您的集中式服务器专用 IP :

*.*                         @private_ip_of_ryslog_server:514

保存并退出该文件。

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

重新启动rsyslog以启用更改:

sudo service rsyslog restart

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

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

步骤5 - 将日志数据格式化为JSON

Elasticsearch要求它接收的所有文档都是JSON格式,而rsyslog提供了一种通过模板实现此目的的方法。

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

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

sudo nano /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期望接收它们的方式格式化您的消息。这就是他们的样子:

{
  "@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,Logstash与本教程的Droplet相同。

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

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

sudo nano /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或更高版本。在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

# 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的端口需要Logstash以root身份运行,这不是一个好的安全措施。

请务必将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

你会看到这样的东西:

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现在客户端rsyslog现在服务器液滴应该所有的日志数据发送到Logstash,然后一起Elasticsearch通过。让我们生成一条安全消息来验证Elasticsearch是否确实收到了这些消息。

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

sudo 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中了。

也许您的数据在进一步解析和标记化方面会更有价值。如果是这样,那么了解有关Logstash的更多信息将有助于您实现该结果。

想要了解更多关于集中日志的相关教程,请前往腾讯云+社区学习更多知识。

参考文献:《 How To Centralize Logs with Rsyslog, Logstash, and Elasticsearch on Ubuntu 14.04》

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

扫码关注云+社区

领取腾讯云代金券