miei log sono formattati in questo modo:Logstash Grok messaggio righe
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
Ci sono 2 tipi di eventi:
-log su una linea come la prima
-log on line più come il secondo
Sono in grado di elaborare l'evento a una riga, ma non sono in grado di elaborare il secondo tipo, in cui vorrei inserire il messaggio in una variabile e la soluzione in un'altra .
Questo è il mio 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"]
}
}
}
Quindi questo è quello che ho fatto, e vorrei avere nel mio output della console il seguente:
{
"@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, vorrei ottenere tutte le espressioni tra due parole ("messaggio" e "soluzione" per la variabile del messaggio, "soluzione" e la fine dell'evento per la variabile di soluzione), e che non importa se l'espressione è su una o più righe.
Grazie in anticipo
Hai provato semplicemente 'messaggio: (?. *) soluzione :( *)'?.? Non so se corrisponde a newline in grok o no - se non si può mettere '[. \ r \ n] *' invece di '. *' –
Alcanzar