Problemas con el análisis de archivo xml con logstash

Hola a Todos
Soy muy novata con ELK y tengo un problema para el que necesitaría vuestra ayuda.
Tengo una serie de archivos xml con esta configuración
<row> <Date>16/05/2016</Date> <Hour>00:00:03</Hour> <Unit>OTT-TV-Ulises3</Unit> <TestVerdict>PASS</TestVerdict> <Description>Test OK</Description> <ChannelName>Canal Plus Series</ChannelName> <ZappingTime>4515</ZappingTime> </row> <row> <Date>16/05/2016</Date> <Hour>00:00:03</Hour> <Unit>OTT-TV-Camarillo2</Unit> <TestVerdict>PASS</TestVerdict> <Description>Test OK</Description> <ChannelName>National Geographic</ChannelName> <ZappingTime>4485</ZappingTime> </row> <row> <Date>16/05/2016</Date> <Hour>00:00:03</Hour> <Unit>OTT-FO-AREQUIPA2</Unit> <TestVerdict>PASS</TestVerdict> <Description>Test OK</Description> <ChannelName>DisneyJr</ChannelName> <ZappingTime>4469</ZappingTime> </row> <row> <Date>16/05/2016</Date> <Hour>00:00:04</Hour> <Unit>OTT-FO-PILAR</Unit> <TestVerdict>PASS</TestVerdict> <Description>Test OK</Description> <ChannelName>Calle 13</ChannelName> <ZappingTime>10797</ZappingTime> </row> </rows>
Para la configuración de logstash he usado el codec multilinea para agrupar documentos y el filtro xml donde creo los campos que quiero con los xpath correspondientes tal que así:

input {
file {
path => "C:/ES/*.xml"
start_position => "beginning"
type => "stock3"
codec =>multiline {
pattern => "/row"
negate => "true"
what => previous
}
}
}
filter {
xml {
source => message
store_xml => "false"
remove_namespaces => "true"
xpath => [
"/rows/row/Date/text()", "Date",
"/rows/row/Hour/text()", "Hour",
"/rows/row/Unit/text()", "Unit",
"/rows/row/TestVerdict/text()", "TestVerdict",
"/rows/row/Description/text()", "Description",
"/rows/row/ChannelName/text()", "ChannelName",
"/rows/row/ZappingTime/text()", "ZappingTime"
]
}
date {
match => [ "Hour","HH:mm:ss"]
target => "@timestamp"
}
date {
match => [ "Date","dd/MM/yyyy"]
}
}
output{
elasticsearch{
index => ["logstash-prueba3-%{+yyyy.MM.dd}"]
hosts => ["localhost:9200"]
}
stdout { codec => rubydebug }
}

El resultado es una sola linea tal que así:

Pipeline main started
{
"@timestamp" => "2016-05-24T10:09:43.996Z",
"message" => "?<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n\r\n \r\n 16/05/2016\r\n 00:00:03\r\n OTT-FO-Barcelona\r\n PASS\r\n Test OK\r\n Cosmo\r\n 5390\r",
"@version" => "1",
"tags" => [
[0] "multiline"
],
"path" => "C:/ES/xml/OTT live/TVOTT/Prueba corta/TVOTT_prueba1.xml",
"host" => "vcamarillo-PC",
"type" => "stock3"
}

He realizado múltiples configuraciones con los xpath pero no consigo nada distinto.
Me podríais ayudar?

Muchas Gracias
Un saludo
Merche

Buenos dias,
mi recomendación para tu caso de uso, seria la de explorar el uso de filebeat, con el que podrás aplicar el multiline de forma más senzilla en origen (cuando leas el archivo). Si quires ver un ejemplo de aplicatión con un modelo parecido, puedes echar un vistazo a https://github.com/purbon/elasticstack_sports_demo/tree/master/config/filebeat .

Cabe decidir que también es posible hacerlo con el codec multiline, pero la expresión, y sobretodo su interacción con el caso de leer ficheros una sola vez, lo hace complicado. Para el caso de hacerlo con el codec, te recomiendo negar el pattern.

Saludos

Pere

Voy a probarlo

Muchas Gracias

Hola de nuevo

Al final he conseguido analizar los archivos con filebeat y logstash y todo muy bien. Ahora el problema que tengo es con otros archivos xml en los que no hay saltos de paginas (están en una sola linea) y que a la hora de analizarlos usando filebeat no hace nada pero si los guardo con un editor xml antes, si los reconoce y los analiza. ¿Hay alguna manera de configurar filebeat para evitar el paso por el xml editor?.
Muchas Gracias de nuevo
Un saludo

Hola!

Lamentablemente tu problema es con los saltos de lineas en los archivos plain, mas que xml. No hay forma de que logstash sepa que no hay un salto de linea. En el futuroqueremos crear un file reader que pueda leer hasta el final sin importarle el salto de linea.

Por el momento, sin pasar por el editor, lo otro que puedes hacer es fijarte con un grep o algo asi si los files tienen salto de linea, y de lo contrario agregarle un salto de linea para que lea el file.

Saludos!