在我之前的文章:

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

  • 使用 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/

【2】Setup Rsyslog Server on Ubuntu 20.04 - kifarunix.com

Logo

更多推荐