2014-10-20 24 views
16

Çok satırlı olayları birleştiren ve bunları oduncu protokolü üzerinden gönderen bir uzak makinem var. Grok/logstash'daki yeni satırı nasıl eşleştirebilirim?

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

Ben

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

GREEDYDATA ile mesaj oluşturmak üzere deneyin

istediğim gibi yaklaşık olarak açgözlü değil: gelir Ne

şuna benzer bir şeydir.

Öyleyse ben gsub kullanmaya çalıştı:

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

ancak bir yerine

The Quick brown fox 
jumps over the lazy 
groks 
Ben

The Quick brown fox\njumps over the lazy\ngroks 

Yani var

...

işe yaramadı

Nasıl ekleyebilirim Verilerime yeni satır ekledim, GREEDYDATA'u yeni satırlarımla eşleştir, yoksa başka bir şekilde mesajımın ilgili bölümünü al.

+1

http://stackoverflow.com/questions/24307965/logstash-grok-multiline-message kopyası gibi. –

+0

@ MagnusBäck temelde evet, bu soru yeni satırları önemsemese de, sonuç mesajında ​​yeni satırların bulunmasını istiyorum. –

cevap

48

Tüm GREEDYDATA olduğunu .*, ancak (?<message>(.|\r|\n)*) ile %{GREEDYDATA:message} yerine ve gerçekten açgözlü olmak alabilirsiniz ., yeni satır uymuyor. başlangıcına regex bayrağı ekleme

+0

(( (. | R = \ n) *) 'yaptım! 20 sekme açıldı ve burada o kadar yüksek olmayan bir cevapta buldum. Çok teşekkür ederim. –

+1

'(. | R | \ n) *', bu, performans katil kalıbı olduğu için mutlak kötülük olan en talihsiz kalıplardan biridir. Herhangi bir karakteri '.' Ile eşleştirmek için, sadece uygun modifiye ediciyi, Oniguruma'da kullanın, bu (? M) 'dir. PCRE ve PCRE ile ilgili tatlarda, '(? S)' işlevini kullanın. JS'de, bir nokta yerine '[^]' veya '[\ s \ S]' kullanın. –

16

eşleşen satırbaşıyla sağlar:

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

Teşekkürler. Bu da sadece grok değil, gsub gibi şeyler için de çalışır. Örneğin. İleti alanından (Active Directory'den gönderilen) ilk satırı ayıklamak için Girdi: "" İleti "=>" Bilgisayar bir hesabın kimlik bilgilerini doğrulamayı denedi. \ r \ n \ r \ n Kimlik Doğrulama Paketi: \ tMICROSOFT_AUTHENTICATION_PACKAGE_V1_0 \ r \ n' Kod: 'gsub => [" İleti ","^(? m) ([^ \ r] *). * "," \ 1 "]' Çıktı: '" İleti "= > "Bilgisayar bir hesabın kimlik bilgilerini doğrulamaya çalıştı." –