Como dividir o evento Logstash contendo várias vezes o mesmo padrão

Estou lendo uma entrada formatada em xml e estou tentando extrair cada linha de uma tabela html como um evento separado.

Por exemplo, se minha entrada for:

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

Eu quero que a saída seja:

{
       "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"
}

O problema é que eu preciso dividir um evento em vários eventos. O uso do filtro de divisão não funcionou porque remove a cadeia usada como "terminador".

Eu projetei um padrão de grok personalizado para extrair o conteúdo de uma linha html:(?<data><tr>(.)*?</tr>)

Infelizmente, esse padrão detecta apenas a primeira ocorrência e, embora haja um número finito de ocorrências em um único xml, o número de linhas não é conhecido antecipadamente.

Tendo uma olhadaJIRA-703 no site logstash Receio que o grok não consiga encontrar um único padrão várias vezes. (Por enquanto, março de 2015)

Sou forçado a codificar meu próprio filtro personalizado? É possível armazenar cada partida de um filtro grok como um novo evento?

Você pode dar uma olhada no meu filtro

    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
        }
    }

Acho que quando eu divido o evento antes e depois da linha, o filtro grok parece não funcionar mais. Na verdade, recupero o que quero no campo "mensagem", mas não mais no campo "dados", conforme desejado.

O estranho é que não recebo uma tag "_grokparsefailure" enquanto não recebo um campo de dados. Isso parece indicar que realmente existe uma correspondência, mas não é armazenada em um campo.

questionAnswers(0)

yourAnswerToTheQuestion