2014-06-19 17 views
18

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

+2

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

risposta

11

Sembra che si hanno due problemi:

È necessario combinare in modo corretto le multilinee:

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

Questa combinerà ogni riga che inizia con uno spazio nella riga precedente. Si può finire per dover usare un "successivo" anziché un "precedente".

Sostituire Newlines

Non credo che Grok corrisponde su più righe.

Ho aggirato questo facendo quanto segue nella sezione dei filtri. Questo dovrebbe andare prima sezione Grok:

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

Questo mi ha permesso di Grok multilinee come una linea di grande piuttosto che corrispondono solo fino al "\ n".

+0

Le impostazioni multilinea nella domanda sono più o meno corrette e sono simili a ciò che è nella documentazione. Il pattern TIMESTAMP_ISO8601 potrebbe non corrispondere - se questo era il motivo per cui il campione di OP non era corretto, dovrebbe essere indicato. – makhdumi

+1

Il filtro 'multiline' è stato deprecato e dovrebbe essere sostituito da [codice multilinea] (https://www.elastic.co/guide/en/logstash/current/plugins-codecs-multiline.html) – exhuma

11

Per quanto riguarda multilinea Grok, è meglio usare la bandiera speciale per stringa di testo:

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

Ricordare usare grok * dopo * l'istruzione multilinea. –

+1

Questa dovrebbe essere la risposta migliore.Funziona perfettamente e può essere testato su http://grokdebug.herokuapp.com/. Grazie – makhdumi

Problemi correlati