一尘不染

为什么Logstash多行不基于grok'd字段合并行?

elasticsearch

我正在尝试使logstash多行与以下测试文件一起使用:

val=abc
123 abc
test

并为过滤器使用以下配置:

filter
{
    if [message] =~ "val"
    {
         match => ["message", "val=%{WORD:calc}"
    }
    multiline
    {
        pattern => [calc]
        what => "next"
    }
}

输出显示如下(除去其他字段):

"message" => "val=abc"
"calc" => "abc"
...
"message" => "123 abc"

上面的内容让我知道grok是匹配的(因此是“ calc”字段),但是我不确定为什么多行不合并第一行和第二行


阅读 297

收藏
2020-06-22

共1个答案

一尘不染

您是说如果该calc字段存在,第一行和第二行将合并为一个Envet?

如果是,以下答案可以为您提供帮助。您的多行模式不正确。请参考此配置:

input {
    stdin{}
}

filter {
    if [message] =~ "val"
    {
        grok {
            match => ["message", "val=%{WORD:calc}"]
        }
    } 
    multiline
    {
        pattern => "(val)"
        what => "next"
    }
}

output {
    stdout {
        codec => "rubydebug"
    }
}

多行中的模式是当message字段中有val单词时,您遇到该模式,它将与第二行多行合并。在您的例子中,你使用[cal]这方式时,message现场有cal字,但是,没有任何calmessage领域。

2020-06-22