test patterns online mutate regex logstash

regex - patterns - Logstash grok mensaje multilínea



logstash grok mutate (2)

En lo que respecta a multiline grok, es mejor usar un indicador especial para la cadena de patrón:

grok { match => ["message", "(?m)%{SYSLOG5424LINE}"] }

Mis registros están formateados de esta manera:

2014-06-19 02:26:05,556 INFO ok 2014-06-19 02:27:05,556 ERROR message:space exception at line 85 solution:increase space remove files

Hay 2 tipos de eventos:

-log en una línea como la primera

-log en linea múltiple como la segunda

Soy capaz de procesar el evento de una línea, pero no puedo procesar el segundo tipo, donde me gustaría almacenar el mensaje en una variable y la solución en otra.

Esta es mi configuración:

input { file { path => ["logs/*"] start_position => "beginning" codec => multiline { pattern => "^%{TIMESTAMP_ISO8601} " negate => true what => previous } } } filter { #parsing of one line event grok { patterns_dir => "./patterns" match=>["message","%{TIMESTAMP_ISO8601:timestamp} %{WORD:level} ok"] } #the parsing fail, so we assumed we are in multiline events, now I process them and I am stuck when I am getting to the new line. if "_grokparsefailure" in [tags] { grok { patterns_dir => "./patterns" match=>["message","%{TIMESTAMP_ISO8601:timestamp} %{WORD:level}/r/n"] } } }

Así que esto es lo que he hecho, y me gustaría tener en mi consola lo siguiente:

{ "@timestamp" => "2014-06-19 00:00:00,000" "path" => "logs/test.log" "level"=>"INFO" }, { "@timestamp" => "2014-06-19 00:00:00,000" "path" => "logs/test.log" "level"=>"ERROR" "message" => "space exception at line 85" "solution"=>"increase space remove files" }

Concretamente, me gustaría obtener todas las expresiones entre dos palabras ("mensaje" y "solución" para la variable de mensaje, "solución" y el final del evento para la variable de solución), y eso no importa si la expresión está en uno o multiples lineas.

Gracias por adelantado


Parece que tienes dos problemas:

Necesitas combinar correctamente tus multilíneas:

filter { multiline { pattern => "^ " what => "previous" } }

Esto combinará cualquier línea que comience con un espacio en la línea anterior. Puede terminar teniendo que usar un "siguiente" en lugar de un "anterior".

Reemplazar nuevas líneas

No creo que grok coincida con las nuevas líneas.

Resolví esto haciendo lo siguiente en su sección de filtro. Esto debe ir antes de la sección de grok:

mutate { gsub => ["message", "/n", "LINE_BREAK"] }

Esto me permitió agrupar líneas múltiples como una línea grande en lugar de hacer coincidir solo hasta el "/ n".