Logstash grok 过滤器自定义模式不起作用
Logstash grok filter custom pattern is not working
我有一个日志文件 (http://codepad.org/vAMFhhR2),我想从中提取一个特定的数字(第 18 行)
我写了一个自定义模式 grok 过滤器,在 http://grokdebug.herokuapp.com/ 上测试了它,它工作正常并提取了我想要的值。
这是 logstash.conf 的样子:
input {
tcp {
port => 5000
}
}
filter {
grok{
match => [ "message", "(?<scraped>(?<='item_scraped_count': ).*(?=,))" ]
}
}
output {
elasticsearch {
hosts => "elasticsearch:9200"
}
}
但它与 Kibana 上同一日志中的任何记录都不匹配
想法?
您的正则表达式可能有效,但先行和后行(“?=”和“?<=”)在这种情况下不是一个好的选择。相反,您可以使用更简单的过滤器:
match => [ "message", "'item_scraped_count': %{NUMBER:scraped}" ]
这将使用 'NUMBER' Grok built-in pattern.
将 'item_scraped_count':
之后的数字提取为名为 scraped
的字段
Kibana 中的结果:
{
"_index": "logstash-2017.04.11",
"_type": "logs",
"_source": {
"@timestamp": "2017-04-11T20:02:13.194Z",
"scraped": "22",
(...)
}
}
如果我可以建议另一个改进:由于您的消息分布在多行中,您可以使用 multiline
输入编解码器轻松合并它:
input {
tcp {
port => 5000
codec => multiline {
pattern => "^(\s|{')"
what => "previous"
}
}
}
这会将所有以空格或 {'
开头的行与前一行合并。
我有一个日志文件 (http://codepad.org/vAMFhhR2),我想从中提取一个特定的数字(第 18 行) 我写了一个自定义模式 grok 过滤器,在 http://grokdebug.herokuapp.com/ 上测试了它,它工作正常并提取了我想要的值。
这是 logstash.conf 的样子:
input {
tcp {
port => 5000
}
}
filter {
grok{
match => [ "message", "(?<scraped>(?<='item_scraped_count': ).*(?=,))" ]
}
}
output {
elasticsearch {
hosts => "elasticsearch:9200"
}
}
但它与 Kibana 上同一日志中的任何记录都不匹配
想法?
您的正则表达式可能有效,但先行和后行(“?=”和“?<=”)在这种情况下不是一个好的选择。相反,您可以使用更简单的过滤器:
match => [ "message", "'item_scraped_count': %{NUMBER:scraped}" ]
这将使用 'NUMBER' Grok built-in pattern.
将'item_scraped_count':
之后的数字提取为名为 scraped
的字段
Kibana 中的结果:
{
"_index": "logstash-2017.04.11",
"_type": "logs",
"_source": {
"@timestamp": "2017-04-11T20:02:13.194Z",
"scraped": "22",
(...)
}
}
如果我可以建议另一个改进:由于您的消息分布在多行中,您可以使用 multiline
输入编解码器轻松合并它:
input {
tcp {
port => 5000
codec => multiline {
pattern => "^(\s|{')"
what => "previous"
}
}
}
这会将所有以空格或 {'
开头的行与前一行合并。