2017-04-11 8 views
0

Ich habe eine Log-Datei (http://codepad.org/vAMFhhR2), und ich möchte eine bestimmte Zahl daraus extrahieren (Zeile 18) Ich schrieb eine benutzerdefinierte Muster Grok Filter, testete es auf http://grokdebug.herokuapp.com/, es funktioniert gut und extrahiert meinen gewünschten Wert.Logstash Grok Filter benutzerdefinierte Muster funktioniert nicht

hier, wie logstash.conf wie folgt aussieht:

input { 
    tcp { 
     port => 5000 
    } 
} 

filter { 
    grok{ 
     match => [ "message", "(?<scraped>(?<='item_scraped_count':).*(?=,))" ] 
    } 
} 

output { 
    elasticsearch { 
     hosts => "elasticsearch:9200" 
    } 
} 

aber es entspricht nicht alle Datensätze aus dem gleichen Protokoll auf Kibana

Gedanken?

+0

Was versuchen Sie mit diesem Lookahead und Lookbehind zu erreichen? Versuchen Sie, die Zeilen zu verwerfen, die nicht übereinstimmen? –

Antwort

0

Ihre Regexp ist möglicherweise gültig, aber Lookahead und Lookbehind ("? =" Und "? < =") sind in diesem Kontext keine gute Wahl. Stattdessen könnte man einen viel einfacheren Filter verwenden:

match => [ "message", "'item_scraped_count': %{NUMBER:scraped}" ] 

Dies wird die Zahl nach 'item_scraped_count': als Feld scraped, mit dem ‚NUMBER‘ Grok built-in pattern genannt extrahieren.

Ergebnis in Kibana:

{ 
    "_index": "logstash-2017.04.11", 
    "_type": "logs", 
    "_source": { 
    "@timestamp": "2017-04-11T20:02:13.194Z", 
    "scraped": "22", 
    (...) 
    } 
} 

Wenn ich eine weitere Verbesserung könnte darauf hindeuten,: da Ihre Nachricht über mehrere Zeilen verteilt wird Sie leicht mit dem multiline Eingangs Codec fusionieren könnte:

input { 
    tcp { 
     port => 5000 
     codec => multiline { 
      pattern => "^(\s|{')" 
      what => "previous" 
     } 
    } 
} 

Dieser Wille füge alle Zeilen ein, die entweder mit einem Leerzeichen oder {' mit dem vorherigen beginnen.

+0

Das hat funktioniert, danke. Woher bekomme ich mehr Wissen über die Kodierung von Logstash-Filtern? – IbrahimSharaf

+0

Die offizielle Dokumentation ist ziemlich gut, überprüfen Sie die "Hilfe" Abschnitt: https://www.elastic.co/guide/en/logstash/current/plugins-filters-grok.html –

+0

In Bezug auf die Multiline-Filter habe ich es hinzugefügt aber ich erwartete, dass ich das gesamte Logfile als eine einzelne Nachricht auf Kibana finden würde, aber es wurde in 2 Nachrichten aufgeteilt (http://codepad.org/gNGvbi4j), (http://codepad.org/qvRjg925) – IbrahimSharaf