2014-07-07 13 views
10

aşağıdaki biçimde günlük hatları var ve alanları elde etmek istiyorum ettik:Logstash grok filtresi - isim alanları dinamik

[field1: content1] [field2: content2] [field3: content3] ... 

ben alan adlarını biliyorum, ne de alanların sayısı.

Ben geribaşvuruların ve sprintf formatı ile denedim ama hiçbir sonuç var:

match => [ "message", "(?:\[(\w+): %{DATA:\k<-1>}\])+" ] # not working 
match => [ "message", "(?:\[%{WORD:fieldname}: %{DATA:%{fieldname}}\])+" ] # not working 

Bu yalnızca bir alan için iş gibi görünüyor ama değil daha:

match => [ "message", "(?:\[%{WORD:field}: %{DATA:content}\] ?)+" ] 
add_field => { "%{field}" => "%{content}" } 

kv filtre de değil Uygun, çünkü alanların içeriği whitespaces içerebilir.

Bu sorunu gidermek için herhangi bir eklenti/strateji var mı?

cevap

8

Logstash Ruby Plugin size yardımcı olabilir. o da, ben 4 alanlarla deneyin

{ 
    "message" => "[field1: content1] [field2: content2] [field3: content3]", 
    "@version" => "1", 
"@timestamp" => "2014-07-07T08:49:28.543Z", 
     "host" => "abc", 
    "field1" => "content1", 
    "field2" => "content2", 
    "field3" => "content3" 
} 

: Günlüklerinizin ile

input { 
    stdin {} 
} 

filter { 
    ruby { 
     code => " 
      fieldArray = event['message'].split('] [') 
      for field in fieldArray 
       field = field.delete '[' 
       field = field.delete ']' 
       result = field.split(': ') 
       event[result[0]] = result[1] 
      end 
     " 
    } 
} 

output { 
    stdout { 
     codec => rubydebug 
    } 
} 

:

[field1: content1] [field2: content2] [field3: content3] 

Bu çıkış olduğunu :) İşte

yapılandırma Eserleri.

Lütfen ruby ​​kodundaki event'un logstash olayı olduğunu unutmayın. message, @timestamp vb. Tüm etkinlik alanlarınızı almak için kullanabilirsiniz.

Enjoy it !!!

ruby { 
    code => " 
     fields = event['message'].scan(/(?<=\[)\w+: .*?(?=\](?: |$))/) 
     for field in fields 
      field = field.split(': ') 
      event[field[0]] = field[1] 
     end 
    " 
} 
:
5

ben regex kullanarak başka bir yol buldu