正确设置使用 logstash 将自定义日志解析到 kibana,我没有看到错误也没有数据

proper set up of parsing custom logs with logstash to kibana, i see no errors and no data

我正在尝试使用 kibana 看看它是如何工作的。

我能够在没有 logstash 的情况下直接从同一台服务器添加 nginx 日志数据并且它工作正常。但是使用 logstash 从不同的服务器读取日志文件不显示数据。没有错误..但没有数据。

我有来自 PM2 的自定义日志,它为我运行一些 PHP 脚本,消息格式为:

Timestamp [LogLevel]: msg

示例:

2021-02-21 21:34:17 [DEBUG]: file size matches written file size 1194179

所以我的 gork 过滤器是:

"%{DATESTAMP:timestamp} \[%{LOGLEVEL:loglevel}\]: %{GREEDYDATA:msg}"

我用 Gork Validator 检查过,语法与文件格式匹配。

我有包含调试级别后缀 out 的文件,以及错误级别后缀 error 的文件。

为了在 kibana 服务器上配置 logstash,我在文件 /etc/logstash/conf.d/pipeline.conf 中添加了以下内容:

input {
    beats {
        port => 5544
    }
}
filter {
 grok {
   match => {"message"=>"%{DATESTAMP:timestamp} \[%{LOGLEVEL:loglevel}\]: %{GREEDYDATA:msg}"} 
 }
mutate {
    rename => ["host", "server"]
    convert => {"server" => "string"}
}
}

output {
    elasticsearch {
        hosts => "http://localhost:9200"
        user => "<USER>"
        password => "<PASSWORD>"
    }
}

我需要将 host 变量重命名为 server 否则我会得到像 Can't get text on a START_OBJECTfailed to parse field [host] of type [text]

这样的错误

在 pm2 日志所在的第二台服务器上,我使用以下配置 filebeat:

- type: filestream
  enabled: true
  paths:
    - /home/ubuntu/.pm2/*-error-*log
  fields:
   level: error
- type: filestream
  enabled: true
  paths:
    - /home/ubuntu/.pm2/logs/*-out-*log
  fields:
   level: debug

我尝试使用 log 而不是 filestream 结果是一样的。 但是使用 filestream 是有意义的,因为日志会在 ?

上不断更新

所以我在一台服务器上有 logstash 运行,在另一台服务器上有 filebeat,打开防火墙端口,我可以看到它们正在连接,但我没有看到任何新的Kibana 日志仪表板中的数据与我使用 logstash 获取的文件相关。

filebeat 日志总是显示这一行 Feb 24 04:41:56 vcx-prod-backup-01 filebeat[3797286]: 2021-02-24T04:41:56.991Z INFO [file_watcher] filestream/fswatch.go:131 Start next scan 以及一些关于分析指标的信息,所以它看起来很好,但仍然没有数据。

我尽量在此处提供尽可能多的信息,我是 kibana 的新手,我不知道如果没有错误,为什么 kibana 中不显示数据。

我想也许我没有在 gork 过滤器中正确转义方括号,所以我尝试使用 "%{DATESTAMP:timestamp} \[%{LOGLEVEL:loglevel}\]: %{GREEDYDATA:msg}"\[ 替换为 \[ 但结果是一样的。

如能提供有关此问题的任何信息,我们将不胜感激。

#更新 ֿ 使用堆栈版本 7.11.1

根据@leandrojmp 的建议,我改回 log 而不是 filestream

我在 filebeat 中检查了 harverser.go 相关行,我发现了这些:

Feb 24 14:16:36 SERVER filebeat[4128025]: 2021-02-24T14:16:36.566Z        INFO        log/harvester.go:302        Harvester started for file: /home/ubuntu/.pm2/logs/cdr-ssh-out-1.log
Feb 24 14:16:36 SERVER filebeat[4128025]: 2021-02-24T14:16:36.567Z        INFO        log/harvester.go:302        Harvester started for file: /home/ubuntu/.pm2/logs/cdr-ftp-out-0.log

而且我还注意到,当我将输出配置为标准输出时,我确实看到了来自其他服务器的事件。所以 logstash 确实能正确接收它们,但出于某种原因我在 kiban 中看不到它们。

如果您有使用 stdoutelasticsearch 输出的输出,但您没有在 Kibana 中看到日志,则需要在 Kibana 中创建一个 index pattern 以便它可以显示你的数据。

为您的数据创建 index pattern 后,在您的情况下 index pattern 可能类似于 logstash-* 您需要在 Kibana 中配置日志应用程序以查找此索引,默认情况下,日志应用会查找 filebeat-* 索引。

好的...所以@leandrojmp 帮助我了解了 kibana 的情况。谢谢你!所有的功劳都归于你!只是想写一个可以帮助其他人克服初始设置的日志答案。

让我们重新开始

我想要一个 kibana 节点来监视不同服务器上的自定义日志。 我在两者上都安装了 ubuntu 最新的 LTS,添加了 deb 存储库,在第一个安装了 kibana、elsaticsearch 和 logstash,在第二个安装了 filebeat。

基本设置没有太多的安全性和 SSL,这不是我在这里寻找的,因为我是这个主题的新手,一切都已经设置好了。

kibana.yml 中我将主机更改为 0.0.0.0 而不是 localhost 这样我就可以从外部连接,并且在 logstash 中我添加了以下配置文件:

input {
    beats {
        port => 5544
    }
}
filter {
 grok {
   match => {"message"=>"%{DATESTAMP:timestamp} \[%{LOGLEVEL:loglevel}\]: %{GREEDYDATA:msg}"} 
 }
mutate {
    rename => ["host", "server"]
    convert => {"server" => "string"}
}
}

output {
    elasticsearch {
        hosts => ["http://localhost:9200"]
    }
}

我没有把事情复杂化,也不需要设置额外的身份验证。

我的filebeat.yml配置:

- type: log
  enabled: true
  paths:
    - /home/ubuntu/.pm2/*-error-*log
  fields:
   level: error
- type: log
  enabled: true
  paths:
    - /home/ubuntu/.pm2/logs/*-out-*log
   level: debug

我开始了一切,在任何日志中都没有错误,但在 kibana 中仍然没有数据,因为我不知道 elasticsearch 如何存储它的数据,我需要找出如何连接到 elasticsearch 并查看数据是否存在,所以我执行了 curl -X GET http://localhost:9200/_cat/indices?v 并注意到了一个 logstash 索引,所以我执行了 curl -X GET http://localhost:9200/logstash-2021.02.24-000001/_search 并且我注意到日志数据显示在数据库中。

所以这一定意味着它与 kibana 有关。所以在设置下使用 kibana 的 Web 界面我注意到一个名为 Index pattern for matching indices that contain log data 的配置并且那里的输入与 logstash 索引名称不匹配,所以我在它后面附加了 ,logstash* 瞧!它有效:)

谢谢