我正在尝试使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”字段),但我不确定为什么多行没有合并第一行和第二行

最佳答案

您的意思是如果存在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字,但是cal字段中没有任何message

10-04 22:41
查看更多