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

Posted Elastic 中国社区官方博客

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Logstash:实用 Logstash 收集 Syslog 日志指南相关的知识,希望对你有一定的参考价值。

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

从上面的日志的格式上来看,我们可以看到它是一个非结构化的句子。我们可以通过 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
  
 
  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 日志指南的主要内容,如果未能解决你的问题,请参考以下文章

Logstash:如何配置 Metricbeat 及 Logstash 为 Elasticsearch 8.x 收集数据

logstash收集日志,多台机器,必须要多台机器安装部署吗

filebeat+logstash+elasticsearch收集haproxy日志

使用logstash结合logback收集微服务日志

K8S 日志收集:logstash 安装

误操作引起的Logstash重复收集