正确设置使用 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_OBJECT
和 failed 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 中看不到它们。
如果您有使用 stdout
和 elasticsearch
输出的输出,但您没有在 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*
瞧!它有效:)
谢谢
我正在尝试使用 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_OBJECT
和 failed 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 中看不到它们。
如果您有使用 stdout
和 elasticsearch
输出的输出,但您没有在 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*
瞧!它有效:)
谢谢