【发布时间】:2020-09-21 13:18:00
【问题描述】:
我正在尝试设置 sebp/elk docker 容器以在我的机器上运行 ELK 堆栈。 目标是使用 ELK 记录/解析/搜索日志文件,例如 apache 的访问/错误日志,以及记录 php 执行期间发生的 php 错误日志(这是带有堆栈跟踪的多行错误)。
我尝试解析的 php 错误日志文件示例如下:
[03-Jun-2020 00:39:11 Europe/Berlin] PHP Stack trace:
[03-Jun-2020 00:39:11 Europe/Berlin] PHP 1. {main}() /var/www/myserver.domain/html/index.php:0
[03-Jun-2020 00:39:11 Europe/Berlin] PHP 2. require() /var/www/myserver.domain/html/index.php:17
[03-Jun-2020 00:39:11 Europe/Berlin] PHP 3. require_once() /var/www/myserver.domain/html/wp-blog-header.php:16
[03-Jun-2020 00:39:11 Europe/Berlin] PHP 4. include() /var/www/myserver.domain/html/wp-includes/template-loader.php:27
[03-Jun-2020 00:39:11 Europe/Berlin] PHP 5. the_content() /var/www/myserver.domain/html/wp-content/themes/summer_freedom/index.php:20
[03-Jun-2020 00:39:11 Europe/Berlin] PHP 6. apply_filters() /var/www/myserver.domain/html/wp-includes/post-template.php:79
[03-Jun-2020 00:39:11 Europe/Berlin] PHP 7. call_user_func_array:{/var/www/myserver.domain/html/wp-includes/plugin.php:163}() /var/www/myserver.domain/html/wp-includes/plugin.php:163
[03-Jun-2020 00:39:11 Europe/Berlin] PHP 8. searchnggallerytags() /var/www/myserver.domain/html/wp-includes/plugin.php:163
我使用 filebeat 通过以下 filebeat.yml 配置将日志从本地计算机发送到我的 logstash 容器:
logstash:
enabled: true
hosts:
- localhost:5044
ssl:
certificate_authorities:
- /etc/filebeat/logstash-beats.crt
timeout: 15
filebeat:
prospectors:
-
paths:
- /var/log/php/php_errors.log
document_type: php-errors
到目前为止,我在 elk 容器内想出的 logstash 配置如下:
input {
stdin {
codec => multiline {
pattern => "^\[%{MONTHDAY}-%{MONTH}-%{YEAR} %{TIME} (?<tzname>[a-zA-Z]+/[a-zA-Z]+)\]"
negate => true
what => "previous"
auto_flush_interval => 10
}
type => "php-errors"
}
}
filter {
if [type] == "php-errors" {
grok {
match => { "message" => "(?m)\[(?<logtime>%{MONTHDAY}-%{MONTH}-%{YEAR} %{TIME} (?<tzname>[a-zA-Z]+/[a-zA-Z]+))\] ?%{GREEDYDATA:message}" }
overwrite => [ "message" ]
}
date {
match => [ "logtime", "dd-MMM-yyyy HH:mm:ss" ]
remove_field => [ "logtime" ]
}
}
}
output {
stdout {
codec => rubydebug
}
}
一开始我不确定模式是否真的匹配,所以我使用 kibana 中的 grok 调试器仔细检查它是否正确,并与日志文件中的输入真正匹配。
当在 sebp/elk 容器的 logstash 中使用此配置时,我可以看到 kibana 中的条目,因此通过 filebeat 进行的一般传输工作并且logstash 也能够匹配数据。 不幸的是,我在 kibana 中为 php 错误日志文件中的每一行收到一条消息,尽管我希望将所有属于彼此的行连接起来并作为一个事件存储在 elk 中。
据我了解这里的 grok 模式,logstash 应该在每一行中使用相同的时间戳并匹配多行以将所有行写入一条消息中,而不是创建多个事件。
所以问题是,如果我只是使用了错误的配置,或者如果缺少任何东西,那么我只会得到 1 个事件而不是多个事件。
更新: 按照@leandrojmp 的要求,我按照建议更新了logstash 配置,但是在cli 上运行时,从stdout 上的logstash 中的php-error.log 中的每一行仍然得到以下输出:
{
"host" => {
"name" => "myserver.domain"
},
"@version" => "1",
"@timestamp" => 2020-06-03T21:54:53.886Z,
"message" => "[03-Jun-2020 23:54:49 Europe/Berlin] PHP 1. {main}() /var/www/myserver.domain/html/index.php:0",
"beat" => {
"version" => "6.4.3",
"hostname" => "myserver.domain",
"name" => "myserver.domain"
},
"tags" => [
[0] "beats_input_codec_plain_applied"
],
"offset" => 15896045,
"source" => "/var/log/php/php_errors.log"
}
所以看起来多行匹配在我的logstash中不起作用。
更新 2: 经过更多研究后,我发现不建议在logstash中匹配多行内容,因为如果您将不同机器的多条日志发送到一个logstash实例,最终可能会将不同的日志混合到一条消息中。 建议的方法是使用 filebeat.yml 合并多行消息在将它们发送到 logstash。
【问题讨论】:
标签: logstash kibana logstash-grok elk