Logstash:实用 Logstash 收集 Syslog 日志指南
2022年2月24日 | by mebius
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
上述命令是我在 Ubuntu 机器上打入的命令。是不是看起来有点眼花缭乱啊?
让我们来分析一下一个 syslog 日志的组成:
我们可以看到该行以时间戳开头,包括记录事件的月份名称、月份中的日期、小时、分钟和秒。 下一个条目是生成日志的设备的主机名。 接下来是创建日志条目的进程的名称、进程 ID 号,最后是日志消息本身。
当我们想要监控系统的健康状况或调试错误时,日志非常有用。 但是当我们要处理数十、数百甚至数千个这样的系统时,登录每台机器并手动查看 syslog 显然太复杂了。 通过将所有这些都集中到 Elasticsearch 中,可以更轻松地对所有记录的事件进行鸟瞰,仅过滤我们需要的内容,并在系统出现异常时快速发现。
Grok pattern
从上tgcode面的日志的格式上来看,我们可以看到它是一个非结构化的句子。我们可以通过 Logstash 的Grok 过滤器来实现对这个日志的结构化。我们可以从上面的命令输出中拷贝其中的一行,然后让我们使用 Kibana 提供的工具来进行测试 Grok pattern:
在上面,我们使用了如下的 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
上面标明我们的服务运行正常。
我们也可以通过如下的命令来查看 logstash 服务的输出:
journalctl -u logstash
我们也可以通过如下的方式来查看 logstash 服务的调试信息:
tail -f /var/log/logstash/logstash-plain.log
如果我们现在去查看上面的这个文件,我们会发现这样的错误信息:
显然,是由于权限的问题而导致不能访问 /var/log/syslog 文件。我们可以打入如下的命令:
sudo usermod -a -G adm logstash
然后,我们重新再启动 logstash 服务:
sudo service logstash restart
这次,我们再次查看,就没有发现上面的错误信息了。
我们回到 Kibana 中进行查看:
GET _cat/indices
我们会发现有一个新的 logstash 的索引出现了。
我们使用如下的命令来进行查看文档:
GET logstash/_search
我们可以看到:
显然,我们已经成功地把 syslog 导入到 Elasticsearch 中了。
文章来源于互联网:Logstash:实用 Logstash 收集 Syslog 日志指南
相关推荐: Elastic Stack 8.0 安装 – 保护你的 Elastic Stack 现在比以往任何时候都简单
在 8.0 中,我们很高兴为所有用户带来简化的安全功能。 从 7.1 开始,我们向所有人免费提供了确保 Elastic Stack 安全所需的所有功能。 然而,我们知道设置安全性并不好玩,你需要专注于你的项目目标。 好消息给你! 从 8.0 开始,自管理集群默…