了解组织生成的数百万条日志行是一项艰巨的挑战。一方面,这些日志行提供了应用程序性能,服务器性能指标和安全性的视图。另一方面,日志管理和分析可能非常耗时,这可能会妨碍采用这些日益必要的服务。
开源软件,如rsyslog,Elasticsearch,和Logstash都提供传输,转换和存储您的日志数据的工具。
在本教程中,您将学习如何创建集中式rsyslog服务器以存储来自多个系统的日志文件,然后使用Logstash将它们发送到Elasticsearch服务器。从那里,您可以决定如何最好地分析数据。
要完成本教程,你需要具备以下内容:
sudo
命令的非root账号的Ubuntu服务器,并且已开启防火墙。没有服务器的同学可以在这里购买,不过我个人更推荐您使用免费的腾讯云开发者实验室进行试验,学会安装后再购买服务器。本教程将教您如何集中化syslog生成或接收的日志,特别是称为rsyslog的变体。Syslog和基于syslog的工具(如rsyslog)从内核和许多运行的程序中收集重要信息,以保持类UNIX服务器的运行。由于syslog是标准,而不仅仅是程序,许多软件项目都支持将数据发送到syslog。通过集中这些数据,您可以更轻松地审核安全性,监控应用程序行为并跟踪其他重要的服务器信息。
从集中式或聚合的rsyslog服务器,您可以将数据转发到Logstash,这可以进一步解析和丰富您的日志数据,然后再将其发送到Elasticsearch。
本教程的最终目标是:
在同一个DigitalOcean数据中心中,创建以下启用了专用网络的 Droplet :
您还需要一个对每个服务器都具有sudo权限的非root用户。
注意:为了最大限度地提高性能,Logstash默认会尝试分配1 GB的内存,因此请确保集中式服务器实例的大小相应。
在本节中,您将确定为每个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 addr
在eth1
内部。在这种情况下,专用网络地址是10.128.2.25。此地址只能从同一区域内启用了专用网络的其他服务器访问。
请务必对所有3个Droplet重复此步骤。将这些私有IP地址保存在安全的地方。它们将在本教程中使用。
作为先决条件的一部分,您可以在自己的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。
在本节中,我们将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
)分别加载imudp
和imtcp
模块。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`命令。
在本节中,我们将配置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
命令。
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。
发送的数据尚未使用此格式。下一步显示配置服务器以使用此模板文件。
现在我们有了定义正确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以接收消息。
在此步骤中,您将安装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}
之前,我们将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 删除。
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有