如何拆分包含多次相同模式的Logstash事件

时间:2015-03-20 11:00:46

标签: logstash grok

我正在阅读xml格式化输入,并且我试图将html表格的每一行都作为单独的事件提取。

例如,如果我的输入是:

<xml> <table> <tr> <td> 1 </td> <td> 2 </td> </tr> <tr> <td> 3 </td> <td> 4 </td> </tr> </table> </xml>

我希望输出为:

{
       "message" => "<tr> <td> 1 </td> <td> 2 </td> </tr>",
      "@version" => "1",
    "@timestamp" => "2015-03-20T10:30:38.234Z",
          "host" => "VirtualBox"
}
{
       "message" => "<tr> <td> 3 </td> <td> 4 </td> </tr>",
      "@version" => "1",
    "@timestamp" => "2015-03-20T10:30:38.234Z",
          "host" => "VirtualBox"
}

问题是我需要将事件拆分为多个事件。使用拆分过滤器不起作用,因为它删除了用作&#34;终结符的字符串&#34;。

我设计了一个自定义grok模式来提取html行的内容: (?<data><tr>(.)*?</tr>)

不幸的是,这种模式只检测到第一次出现,虽然单个xml中出现的次数有限,但事先并不知道行数。

看看JIRA-703 on logstash website我害怕grok多次找不到单一模式。(目前,2015年火星)

我是否被迫编写自己的自定义过滤器?是否可以将grok过滤器的每个匹配项存储为新事件?

您可以查看我的过滤器

    input {
        stdin { }
    }

    filter {
        mutate {
            gsub => ["message", "<tr>", "[split]<tr>"]
        }
        mutate {
            gsub => ["message", "</tr>", "</tr>[split]"]
        }
        split {
            terminator => "[split]"
        }
        grok {
            patterns_dir => "../patterns"
            #voir pourquoi le meme pattern plusieurs fois ne fonctionne pas
            #https://logstash.jira.com/browse/LOGSTASH-703
            match => ["message", "%{HTML_ROW_LINE:data}" ]
        }
    }

    output {
        stdout {
            codec => rubydebug
        }
    }

我发现当我在行之前和之后拆分事件时,grok过滤器似乎不再起作用了。我确实在&#34;消息&#34;中检索了我想要的内容。字段,但不再在&#34;数据&#34;希望的领域。

奇怪的是,我没有得到一个&#34; _grokparsefailure&#34;标签虽然我没有获得数据字段。这似乎表明实际上存在匹配,但它没有存储在字段中。

0 个答案:

没有答案