Beats:使用 Linux 系统上的 Rsyslog 收集日志并导入 Elasticsearch

Posted Elastic 中国社区官方博客

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Beats:使用 Linux 系统上的 Rsyslog 收集日志并导入 Elasticsearch相关的知识,希望对你有一定的参考价值。

在我之前的文章:

我详述了如何使用 Filebeat 中的 system 模块来为 syslog 导入到 Elasticsearch。这是目前为止最为快捷的方法。在实际的使用中,我们也可以使用其它来导入 syslog。这里的方法是:

  • 使用 Logstash 导入

 在今天的文章中,我将详述如何配置 Rsyslog 把数据导入到 Elasticsearch 中。我将使用 Ubuntu 20.04 来进行详述。

配置 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/

【2】https://kifarunix.com/setup-rsyslog-server-on-ubuntu-20-04/

以上是关于Beats:使用 Linux 系统上的 Rsyslog 收集日志并导入 Elasticsearch的主要内容,如果未能解决你的问题,请参考以下文章

Centos 7 部署ELK Stack+beats+kafka

应急响应之Linux日志分析

Beats Filebeat介绍及使用(十六)

基于ELK+Beats进行系统监控

Logstash:如何在 Ubuntu 上使用 RsyslogLogstash 和 Elasticsearch 集中日志

Logstash:如何在 Ubuntu 上使用 RsyslogLogstash 和 Elasticsearch 集中日志