Logstash:实用 Logstash 收集 Syslog 日志指南

2022年2月24日   |   by mebius

tgcode

Syslog 是一种流行的标准,用于集中和格式化网络设备生成的日志数据。 它提供了一种生成和收集日志信息的标准化方式,例如程序错误、通知、警告、状态消息等。 几乎所有类 Unix 操作系统,例如基于 Linux 或 BSD 内核的操作系统,都使用负责收集和存储日志信息的 Syslog 守护进程。

它们通常存储在本地,但如果管理员希望能够从一个位置访问所有日志,它们也可以流式传输到中央服务器。 默认情况下,端口 514 和 UDP 用于传输 Syslog。在我之前的文章 “Beats:使用 Linux 系统上的 Rsyslog 收集日志并导入 Elasticsearch” 介绍了如何使用 Rsyslog 来进行流式方式进而把数据传入到 Elasticsearch 中去。

在今天的文章中,我们来讲述另外一种方式,也就是直接使用 Logstash 把 syslog 数据直接导入到 Elasticsearch 中。这也是对之前的那篇文章的补充吧。

了解 syslog

让我们看一下典型的 syslog 事件是什么样子的。 这些通常在本地收集在一个名为 /var/log/syslog 的文件中。

要显示前 10 行,我们将输入:

head -10 /var/log/syslog

%title插图%num

上述命令是我在 Ubuntu 机器上打入的命令。是不是看起来有点眼花缭乱啊?

让我们来分析一下一个 syslog 日志的组成:

%title插图%num

我们可以看到该行以时间戳开头,包括记录事件的月份名称、月份中的日期、小时、分钟和秒。 下一个条目是生成日志的设备的主机名。 接下来是创建日志条目的进程的名称、进程 ID 号,最后是日志消息本身。

当我们想要监控系统的健康状况或调试错误时,日志非常有用。 但是当我们要处理数十、数百甚至数千个这样的系统时,登录每台机器并手动查看 syslog 显然太复杂了。 通过将所有这些都集中到 Elasticsearch 中,可以更轻松地对所有记录的事件进行鸟瞰,仅过滤我们需要的内容,并在系统出现异常时快速发现。

Grok pattern

从上tgcode面的日志的格式上来看,我们可以看到它是一个非结构化的句子。我们可以通过 Logstash 的Grok 过滤器来实现对这个日志的结构化。我们可以从上面的命令输出中拷贝其中的一行,然后让我们使用 Kibana 提供的工具来进行测试 Grok pattern:

%title插图%num

在上面,我们使用了如下的 Grok pattern:

%{SYSLOGTIMESTAMP:syslog_timestamp} %{SYSLOGHOST:syslog_hostname} %{DATA:syslog_program}(?:[%{POSINT:syslog_pid}])?: %{GREEDYDATA:syslog_message}

从上面的输出中,我们可以看出来经过 Grok 过滤器,它成功地把非结构化的信息转化为结构化的数据。这个便于我们分析数据。

配置 Logstash

我们接下来安装好自己的 Logstash。你可以参考文章 “如何安装 Elastic 栈中的 Logstash”。这里就不在赘述了。在我的 Ubuntu 机器上,我选择使用 DEB 格式的安装。我们在如下的地址创建一个文件:

/etc/logstash/conf.d/syslog.conf

input {
  file {
    path => ["/var/log/syslog"]
    type => syslog
    start_position => "beginning"
    sincedb_path => "/dev/null"
  }
}
 
 
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
  }
tgcode 
  stdout { codec => rubydebug }
}

请注意:在上面,我的 Elasticsearch 的地址是192.168.0.3:9200。它的访问用户及密码是 elastic/password。这个你需要根据自己的配置进行修改。

配置完好 Logstash 后,我们需要重新启动 logstash 服务:

sudo service logstash restart

我们可以使用如下的命令来查看 logstash 服务的状态:

service logstash status

%title插图%num

上面标明我们的服务运行正常。

我们也可以通过如下的命令来查看 logstash 服务的输出:

journalctl -u logstash

%title插图%num

我们也可以通过如下的方式来查看 logstash 服务的调试信息:

 tail -f /var/log/logstash/logstash-plain.log

如果我们现在去查看上面的这个文件,我们会发现这样的错误信息:

%title插图%num

显然,是由于权限的问题而导致不能访问 /var/log/syslog 文件。我们可以打入如下的命令:

sudo usermod -a -G adm logstash

然后,我们重新再启动 logstash 服务:

 sudo service logstash restart

这次,我们再次查看,就没有发现上面的错误信息了。

我们回到 Kibana 中进行查看:

GET _cat/indices

%title插图%num

我们会发现有一个新的 logstash 的索引出现了。

我们使用如下的命令来进行查看文档:

GET logstash/_search

我们可以看到:

%title插图%num

显然,我们已经成功地把 syslog 导入到 Elasticsearch 中了。

文章来源于互联网:Logstash:实用 Logstash 收集 Syslog 日志指南

相关推荐: Elastic Stack 8.0 安装 – 保护你的 Elastic Stack 现在比以往任何时候都简单

在 8.0 中,我们很高兴为所有用户带来简化的安全功能。 从 7.1 开始,我们向所有人免费提供了确保 Elastic Stack 安全所需的所有功能。 然而,我们知道设置安全性并不好玩,你需要专注于你的项目目标。 好消息给你! 从 8.0 开始,自管理集群默…

Tags: ,