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.