2014-07-07 3 views
10

J'ai des lignes de journaux dans le format suivant et que vous souhaitez extraire les champs:filtre Logstash de grok - champs de nom dynamique

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

Je ne connais les noms de champs, ni le nombre de champs.

Je l'ai essayé avec des backreferences et le format sprintf mais obtenu aucun résultat:

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

Cela semble fonctionner pour un seul domaine, mais pas plus:

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

Le filtre kv est pas non plus approprié car le contenu des champs peut contenir des espaces.

Existe-t-il un plugin/stratégie pour résoudre ce problème?

Répondre

8

Logstash Ruby Plugin peut vous aider. :)

Voici la configuration:

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

Avec vos journaux:

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

C'est la sortie:

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

J'essayer avec 4 champs, il a également travaux.

Veuillez noter que le event dans le code ruby ​​est un événement logstash. Vous pouvez l'employer pour obtenir tout votre champ d'événement tel que message, @timestamp etc.

Appréciez-le!

5

J'ai trouvé une autre façon en utilisant regex:

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