Meine Protokolle werden wie folgt formatiert:Logstash grok mehrzeilige Nachricht
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
Es gibt 2 Arten von Veranstaltungen:
-log auf einer Linie wie der erste
-log auf mehrzeilige wie die zweite
Ich bin in der Lage, die Ein-Zeilen-Ereignis zu verarbeiten, aber ich bin nicht in der Lage, den zweiten Typ zu verarbeiten, wo ich die Nachricht in einer Variablen und die Lösung in einem anderen auf Lager haben möchte .
Das ist meine config:
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"]
}
}
}
Also das ist, was ich getan habe, und ich möchte in meiner Konsolenausgabe folgendes haben:
{
"@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"
}
Konkret möchte ich Erhalte den gesamten Ausdruck zwischen zwei Wörtern ("Nachricht" und "Lösung" für die Nachrichtenvariable, "Lösung" und das Ende des Ereignisses für die Lösungsvariable), und zwar unabhängig davon, ob der Ausdruck auf einer oder mehreren Zeilen steht.
Vielen Dank im Voraus
Haben Sie versucht, nur 'Nachricht: (?. *) Lösung :( *)'?.? Ich weiß nicht, ob. passt zu newline in grok oder nicht - wenn nicht, könntest du '[. \ r \ n] *' anstelle von '. *' setzen –
Alcanzar