2014-10-20 17 views
16

Ho una macchina remota che combina eventi multilinea e li invia attraverso il protocollo del boscaiolo.Come abbinare una nuova riga in grok/logstash?

Che cosa viene in è qualcosa che assomiglia a questo:

{ 
    "message" => "2014-10-20T20:52:56.133+0000 host 2014-10-20 15:52:56,036 [ERROR ][app.logic  ] Failed to turn message into JSON\nTraceback (most recent call last):\n File \"somefile.py", line 249, in _get_values\n return r.json()\n File \"/path/to/env/lib/python3.4/site-packages/requests/models.py\", line 793, in json\n return json.loads(self.text, **kwargs)\n File \"/usr/local/lib/python3.4/json/__init__.py\", line 318, in loads\n return _default_decoder.decode(s)\n File \"/usr/local/lib/python3.4/json/decoder.py\", line 343, in decode\n obj, end = self.raw_decode(s, idx=_w(s, 0).end())\n File \"/usr/local/lib/python3.4/json/decoder.py\", line 361, in raw_decode\n raise ValueError(errmsg(\"Expecting value\", s, err.value)) from None\nValueError: Expecting value: line 1 column 1 (char 0), Failed to turn message into JSON" 
} 

Quando provo ad abbinare il messaggio con

grok {   
    match => [ "message", "%{TIMESTAMP_ISO8601:timestamp} \[%LOGLEVEL:loglevel}%{ SPACE}\]\[%{NOTSPACE:module}%{SPACE}\]%{GREEDYDATA:message}" ] 
} 

il GREEDYDATA non è così avido come vorrei.

Allora ho provato ad usare gsub:

mutate { 
    gsub => ["message", "\n", "LINE_BREAK"] 
} 
# Grok goes here 
mutate { 
    gsub => ["message", "LINE_BREAK", "\n"] 
} 

ma che non ha funzionato piuttosto che

The Quick brown fox 
jumps over the lazy 
groks 

ho ottenuto

The Quick brown fox\njumps over the lazy\ngroks 

Quindi ...

Come posso aggiungere newline torna ai miei dati, fai in modo che lo GREEDYDATA corrisponda alle mie newline, o in qualche altro modo prendi la parte rilevante del mio messaggio?

+1

Sembra un duplicato di http://stackoverflow.com/questions/24307965/logstash-grok-multiline-message. –

+0

@ MagnusBäck fondamentalmente sì, anche se quella domanda non interessa le nuove righe ma I * do * richiedono che le nuove linee esistano nel messaggio risultante. –

risposta

48

Tutto GREEDYDATA è è .*, ma . non corrisponde a capo, in modo da poter sostituire %{GREEDYDATA:message} con (?<message>(.|\r|\n)*) e lo fanno per essere veramente avidi.

+0

'(? (. | \ R | \ n) *)' lo ha fatto! Aveva 20 schede aperte e qui lo trovo in una risposta non tanto pubblicizzata. Grazie mille. –

+1

'(. | \ R | \ n) *' è uno dei modelli più sfortunati che sono il male assoluto in quanto questo è un modello di performance killer. Per abbinare qualsiasi carattere con '.', basta usare il modificatore appropriato, in Oniguruma, è' (? M) '. Nei sapori relativi a PCRE e PCRE, usare '(? S)'. In JS, usa '[^]' o '[\ s \ S]' invece di un punto. –

16

Aggiunta la bandiera regex per l'inizio consente una newlines corrispondenti:

match => [ "message", "(?m)%{TIMESTA... 
+0

Grazie. Questo funziona anche per cose come gsub, non solo grok. Per esempio. per estrarre la prima riga da un campo Messaggio (inviato da Active Directory) Input: '" Messaggio "=>" Il computer ha tentato di convalidare le credenziali per un account. \ r \ n \ r \ nPacchetto autenticazione: \ tMICROSOFT_AUTHENTICATION_PACKAGE_V1_0 \ r \ n' Codice: 'gsub => [" Messaggio ","^(? m) ([^ \ r] *). * "," \ 1 "]' Uscita: '" Messaggio "= > "Il computer ha tentato di convalidare le credenziali per un account." ' –

Problemi correlati