Beats:使用 Linux 系统上的 Rsyslog 收集日志并导入 Elasticsearch
在我之前的文章:Beats:Beats 入门教程 (一)Beats:Beats 入门教程 (二)我详述了如何使用 Filebeat 中的 system 模块来为 syslog 导入到 Elasticsearch。这是目前为止最为快捷的方法。在实际的使用中,我们也可以使用其它来导入 syslog。这里的方法是:使用 Filebeat 中的 syslog input使用 Logstash 导入在今天的
在我之前的文章:
我详述了如何使用 Filebeat 中的 system 模块来为 syslog 导入到 Elasticsearch。这是目前为止最为快捷的方法。在实际的使用中,我们也可以使用其它来导入 syslog。这里的方法是:
- 使用 Filebeat 中的 syslog input
- 使用 Logstash 导入
在今天的文章中,我将详述如何配置 Rsyslog 把数据导入到 Elasticsearch 中。我将使用 Ubuntu 20.04 来进行详述。
Syslog 简介
让我们看一下典型的 syslog 事件是什么样子的。 这些通常在本地收集在一个名为 /var/log/syslog 的文件中。
要显示前 10 行,我们将输入:
sudo head -10 /var/log/syslog
让我们分析一下 syslog 行的结构。
我们可以看到该行以时间戳开头,包括记录事件的月份名称、月份中的日期、小时、分钟和秒。 下一个条目是生成日志的设备的主机名。 接下来是创建日志条目的进程的名称、进程 ID 号,最后是日志消息本身。
当我们想要监控系统的健康状况或调试错误时,日志非常有用。 但是当我们要处理数十、数百甚至数千个这样的系统时,登录每台机器并手动查看 syslog 显然太复杂了。 通过将所有这些都集中到 Elasticsearch 中,可以更轻松地对所有记录的事件进行鸟瞰,只过滤我们需要的内容,并在系统出现异常时快速发现。
配置 Rsyslog
在 Linux 上,默认情况下,所有日志文件都位于 /var/log 目录下。 有几种类型的日志文件存储不同的消息,可以是 cron、内核、安全、事件、用户等。 大多数情况下,这些日志文件由 rsyslog 服务控制。
Rsyslog 可以在客户端/服务器模式中进行配置。 当配置为客户端时,它通过 TCP/UDP 协议通过网络将日志发送到远程服务器。 作为服务器,它通过网络从远程客户端在端口 514 TCP/UDP 或任何配置为侦听的自定义端口上接收日志。
如果你的系统还没安装 Rsyslog,那么请按照如下的指令来进行安装:
sudo apt-get update
sudo apt-get install rsyslog
在今天的练习中,我们将把 Rsyslog 配置为客户端,这样它可以发送日志给 Filebeat 或者 Logstash。
我们首先打开 Linux 机器中的文件 /etc/rsyslog.conf。并在该文件的最后添加如下的部分:
/etc/rsyslog.conf
$PreserveFQDN on
*.* @@192.168.0.4:514
$ActionQueueFileName queue
$ActionQueueMaxDiskSpace 1g
$ActionQueueSaveOnShutdown on
$ActionQueueType LinkedList
$ActionResumeRetryCount -1
在上面,我使用了我自己机器的 IP 地址 192.168.0。你需要根据自己的实际 IP 地址进行修改。上面是针对 TCP 端口地址 514 进行配置的。如果你想配置 UDP,你需要把上面的第二行修改为:
*.* @192.168.0.4:514
请注意这里是一个 @ 符号而不是之前的两个 @@。
等我们修改完上面的 rsyslog.conf 后,我们可以使用如下的命令来重新启动该服务:
service rsyslog restart
我们可以使用如下的命令来查看该服务的运行情况:
service rsyslog status
如果你看到上面的 active 则表示该服务运行正常。
很多时候,我们想知道这个服务的日志,我们可以通过如下的命令来进行查看:
journalctl -u rsyslog
通过如上的配置,Rsyslog 被配置为一个 client,它将像服务器 192.168.0.4:512 端口发送日志信息。
使用 Filebeat 收集日志
我们接下来采用 Filebeat 来配置 inputs。我们在如下的位置找到 Filebeat 的配置文件 filebeat.yml,并在该文件中添加如下的 input:
/etc/filebeat/filebeat.yml
filebeat.inputs:
# Each - is an input. Most options can be set at the input level, so
# you can use different inputs for various configurations.
# Below are the input specific configurations.
- type: syslog
enabled: true
max_message_size: 10KiB
timeout: 10
keep_null: true
protocol.tcp:
host: "0.0.0.0:514"
在上面的配置中,我们使用 type 为 syslog,并把 protocol 设置为 tcp。在这种配置下,Filebeat 将运行于服务器模式,等待客户端的链接:
netstat -tnlp | grep :514
# netstat -tnlp | grep :514
tcp6 0 0 :::514 :::* LISTEN 42015/filebeat
在运行 Filebeat 之前,我们确保 system 模块是 disabled 状态:
filebeat modules disable system
这样,我们的 system 模块是不起任何作用的。当然,如果我们需要 Filebeat 中的 system 模块所带来的其它好处,我们可以在 system 模块启动的情况下运行:
filebeat setup
之后再禁止 system 模块。关于 setup 指令的作用,请参考文章 “Beats:解密 Filebeat 中的 setup 命令”。
在修改完 filebeat.yml 文件后,我们重新启动该服务:
service filebeat restart
我们可以使用如下的命令来查看该服务的运行情况:
service filebeat status
我们打开 Kibana,并在 Discover 中查看文档:
我们可以看到 system 日志被收集上来了。
使用 Logstash 导入数据
我们可以参考之前文章 “Logstash:配置例子” 来进行配置。我们在如下的目录中创建一个叫做 sysloog.conf 的文件:
/etc/logstash/conf.d/syslog.conf
input {
tcp {
port => 50515
type => syslog
}
}
filter {
if [type] == "syslog" {
grok {
match => { "message" => "%{SYSLOGTIMESTAMP:syslog_timestamp} %{SYSLOGHOST:syslog_hostname} %{DATA:syslog_program}(?:\[%{POSINT:syslog_pid}\])?: %{GREEDYDATA:syslog_message}" }
add_field => [ "received_at", "%{@timestamp}" ]
add_field => [ "received_from", "%{host}" ]
}
date {
match => [ "syslog_timestamp", "MMM d HH:mm:ss", "MMM dd HH:mm:ss" ]
}
}
}
output {
elasticsearch {
hosts => ["192.168.0.3:9200"]
user => elastic
password => password
}
stdout { codec => rubydebug }
}
如果你是向另外一个带有安全的 Elasticsearch 集群 192.168.0.4 发送数据,那么你可以修改 syslog.conf 如下:
/etc/logstash/conf.d/syslog.conf
input {
tcp {
port => 50515
host => "192.168.0.4"
type => syslog
}
}
filter {
if [type] == "syslog" {
grok {
match => { "message" => "%{SYSLOGTIMESTAMP:syslog_timestamp} %{SYSLOGHOST:syslog_hostname} %{DATA:syslog_program}(?:\[%{POSINT:syslog_pid}\])?: %{GREEDYDATA:syslog_message}" }
add_field => [ "received_at", "%{@timestamp}" ]
add_field => [ "received_from", "%{host}" ]
}
date {
match => [ "syslog_timestamp", "MMM d HH:mm:ss", "MMM dd HH:mm:ss" ]
}
}
}
output {
elasticsearch {
hosts => ["https://192.168.0.4:9200"]
user => elastic
password => password
ssl_certificate_verification => true
cacert => "/etc/logstash/config/certs/ca.crt"
}
stdout { codec => rubydebug }
}
配置完毕后,我们需要重新启动 Logstash 这个服务。
我们把 Rsyslog 里的端口好修改为 50515,然后再重新启动 Rsyslog。
/etc/rsyslog.conf
$PreserveFQDN on
*.* @@192.168.0.4:514
$ActionQueueFileName queue
$ActionQueueMaxDiskSpace 1g
$ActionQueueSaveOnShutdown on
$ActionQueueType LinkedList
$ActionResumeRetryCount -1
我们可以看到许多的日志出现在 Logstash 的屏幕上。我们可以通过如下的命令来查看 Logstash 的日志:
journalctl -u logstash
我们也可以在 Kibana 中看到已经被导入的日志:
参考:
【1】https://computingforgeeks.com/configure-rsyslog-centralized-log-server-on-ubuntu/
更多推荐
所有评论(0)