2014-07-07 20 views
10

devo linee di registro nel seguente formato e vuole estrarre i campi:Logstash filtro Grok - campi di nome dinamicamente

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

io non conosco i nomi dei campi, né il numero di campi.

ho provato con backreference e il formato sprintf ma non ottenne i risultati:

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

Questo sembra funzionare per un solo campo, ma non di più:

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

Il filtro kv non è anche adeguato perché il contenuto dei campi può contenere spazi bianchi.

Esiste un plugin/strategia per risolvere questo problema?

risposta

8

Logstash Rubino Plugin ti può aiutare. :)

Ecco la configurazione:

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

Con vostri log:

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

Questa è l'uscita:

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

devo provare con 4 campi, ma anche lavori.

Si prega di notare che il event nel codice Ruby è logstash evento. Si può usare per ottenere tutti i campi il vostro evento come message, @timestamp ecc

Buon divertimento !!!

5

ho trovato un altro modo con espressioni regolari:

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