2014-10-20 16 views
16

Mam zdalną maszynę, która łączy zdarzenia wielowierszowe i wysyła je przez protokół drwala.Jak mogę dopasować znak nowej linii w grok/logstash?

Co przychodzi coś, co wygląda tak:

{ 
    "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" 
} 

Kiedy próbuję dopasować wiadomość z

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

GREEDYDATA nie jest tak chciwy jak chciałbym.

Więc starałem się używać gsub:

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

ale jeden nie działa zamiast

The Quick brown fox 
jumps over the lazy 
groks 

mam

The Quick brown fox\njumps over the lazy\ngroks 

więc ...

Jak mogę dodać wrócić do moich danych, sprawić, że GREEDYDATA pasuje do moich nowych linii, lub w jakiś inny sposób pobrać odpowiednią część mojej wiadomości?

+1

Wygląda duplikat http://stackoverflow.com/questions/24307965/logstash-grok-multiline-message. –

+0

@ MagnusBäck w zasadzie tak, chociaż to pytanie nie obchodzi nic nowego, ale ja * muszę * wymagać, aby znaki nowej linii istniały w wynikowym komunikacie. –

Odpowiedz

48

GREEDYDATA Wszystko to jest .*, ale . nie pasuje do nowej linii, więc można zastąpić %{GREEDYDATA:message} z (?<message>(.|\r|\n)*) i zmusić go do być naprawdę chciwi.

+0

'(? (. | \ R | \ n) *)' Zrobiłem to! Miałem 20 zakładek otwartych i tutaj znajduję to w niezbyt wysokiej odpowiedzi. Dziękuję Ci bardzo. –

+1

'(. | \ R | \ n) *' jest jednym z najbardziej niefortunnych wzorców, które są absolutnym złem, ponieważ jest to wzór zabójcy wydajności. Aby dopasować dowolny znak do '.', po prostu użyj odpowiedniego modyfikatora, w Oniguruma, jest to' (? M) '. W przypadku smaków związanych z PCRE i PCRE, użyj '(? S)'. W JS, zamiast kropki użyj '[^]' lub '[\ s \ S]'. –

16

dodanie flagi regex początku umożliwia dopasowanie nowej linii:

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

Dzięki. Działa to również dla rzeczy takich jak gsub, nie tylko grok. Na przykład. wyodrębnianie pierwszego wiersza z pola komunikatu (wysyłanego z Active Directory) Dane wejściowe: '" Message "=>" Komputer próbował zweryfikować poświadczenia dla konta. \ r \ n \ r \ nPole uwierzytelniania: \ tMICROSOFT_AUTHENTICATION_PACKAGE_V1_0 \ r \ n " Kod:' gsub => ["Wiadomość", "^ (? m) ([^ \ r] *). *", "\ 1"] ' Wyjście:' "Wiadomość" = > "Komputer próbował zweryfikować dane uwierzytelniające dla konta." ' –

Powiązane problemy