Logstash基本多行过滤器无法正常工作?

时间:2016-06-29 19:52:59

标签: regex logstash

我的日志文件如下所示:

Node Name: StackOverflow
Node IP: 127.0.0.1
Logs: the name of my log
Logs Date: From 2016-06-12 To 2016-06-14
...
...

我试图通过在我的conf中执行此操作,在一个过滤器中加入所有这些行:

input {
  file {
    path   => '[...]'
    start_position => beginning 
    ignore_older => 0 
    codec => multiline {
        pattern => "Log|Node"
        negate => "false"
        what => "previous"
    }
  }
}

output {
  stdout { codec => rubydebug }
}

这样做时,我只是收到消息“{:timestamp =>”2016-06-29T12:51:28.876000-0700“,:message =>”Pipeline main started“}”并且没有打印任何内容。如果我将模式更改为“Log”或“Node”,我会得到一些结果,但显然不完全是我想要的。这似乎很基本,但我被卡住了。我缺少什么?

2 个答案:

答案 0 :(得分:0)

这就是因为该模式与所有行匹配,所以它试图将它们全部连接到与模式不匹配的前一行,而这些模式并不存在。多行编解码器不应与您的所有行匹配,它应该仅匹配多行日志的分隔线(开始或结束行)或不是分隔符的每一行。如果你匹配所有内容,它就会把你所有的行加入到一个大事件中。

如果您的所有日志都以Node Name开头,则可以将模式更改为

pattern => "^Node Name"

^匹配一行开头,确保中间带有Node Name字样的日志不会破坏此行。

并设置

negate => "true"

将加入所有不以"节点名称"开头的行。到他们上面的那条线。以"节点名称"开头的行将匹配正则表达式,因此不会连接到它们上面的行,分隔单独的事件。

参考: https://www.elastic.co/guide/en/logstash/current/plugins-codecs-multiline.html

答案 1 :(得分:0)

如果我已正确理解您的问题,您只想将以Node IP:Logs:Logs Date:开头的行加入以Node Name:开头的行。

您可以使用此多行:

multiline {
    pattern => "(Node IP:)|(Logs:)|(Logs Date:)"
    negate => "false"
    what => "previous"
}

它与Node Name:的第一行不匹配,但另一行将是。