前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >如何在Ubuntu 14.04上使用Rsyslog,Logstash和Elasticsearch集中日志

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

原创
作者头像
八十岁的背影
修改2018-09-20 15:00:16
2.2K0
修改2018-09-20 15:00:16
举报

介绍

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

开源软件,如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》

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

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 介绍
  • 目标
  • 先决条件
  • 第1步 - 确定专用IP地址
  • 第2步 - 设置Elasticsearch的绑定地址
  • 步骤3 - 配置集中服务器以接收数据
  • 步骤4 - 配置rsyslog以远程发送数据
  • 步骤5 - 将日志数据格式化为JSON
  • 步骤6 - 配置集中服务器以发送到Logstash
  • 步骤7 - 配置Logstash以接收JSON消息
  • 第8步 - 验证Elasticsearch输入
  • 结论
相关产品与服务
Elasticsearch Service
腾讯云 Elasticsearch Service(ES)是云端全托管海量数据检索分析服务,拥有高性能自研内核,集成X-Pack。ES 支持通过自治索引、存算分离、集群巡检等特性轻松管理集群,也支持免运维、自动弹性、按需使用的 Serverless 模式。使用 ES 您可以高效构建信息检索、日志分析、运维监控等服务,它独特的向量检索还可助您构建基于语义、图像的AI深度应用。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档