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".