2016-07-12 22 views
0

Ich schreibe eine Logstash-Konfigurationsdatei.Wie funktioniert der Grokfilter in Logstash?

Ich habe einen Grok Filter. Ich würde gerne wissen, wie das Spiel im Grok Filter genau funktioniert.

I bezeichnet ein Beispiel in der logstash Seite und sah wie folgt vor:

Ex log: 55.3.244.1 GET /index.html 15824 0.043
Es ist mit der unten stehenden Filter analysiert wird:

filter { 
    grok { 
    match => { "message" => "%{IP:client} %{WORD:method} %{URIPATHPARAM:request} %{NUMBER:bytes} %{NUMBER:duration}" } 
    } 

Das heißt, wir versuchen, entsprechen die ganze Protokollzeile der Reihe nach? Meine Protokollzeilen sind unterschiedlich. Sie sind nicht immer in einem angemessenen Rahmen.
Sein wie die unten:

1. 11:10:15---somedata 
2. 11:10:20---source--destination-- somedata 
3. somedata 

Ich würde alle drei Arten Linien aufnehmen möchten, schreiben Also sollte ich verschiedene Match-Filter? Oder ist es in Ordnung, Quell-, Ziel- und Somedata-Felder einzeln in einem einzelnen Match zu erfassen?

Ich suche nach Informationen zu diesem Thema.

ja ich verstehe die Grundlagen von Regex und die grok pattern.Aber ich bin immer noch verwirrt darüber, wie ich Match-Block für die folgenden schreiben kann.

line 1: timestamp source destination a=0,b=1,c=3,d=4 
line 2: timestamp a=1,e=5, b=1 
line 3: g=0 

nehme ich diese drei Zeilen in meinem Log-Datei haben, und ich möchte Linien erfassen, die den Wert für b und g haben. Wie würde mein Matchblock aussehen?

Wird dies erfassen alle Zeilen mit b und g ?? für b sollte es 1 und 2 Zeilen erfassen. für g muss es 3 erfassen. Also sollte meine Ausgabe alle drei Zeilen haben ?? So funktioniert es oder würde es einen grokparse Fehler werfen ??

Antwort

1

Der Grok-Filter arbeitet mit den Mustern im Match-Block. Es funktioniert als Regex (für die Definition siehe here). Jedes Muster besteht aus zwei Teilen: %{SYNTAX:SEMANTIC}.
Wenn die aus den Mustern erstellte Regex der gesamten Linie entspricht, wird der Wert aus SYNTAX als Feld mit dem Namen SEMANTIC hinzugefügt.
cf die documentation für weitere Informationen.

Sie können in Ihrem Filter mehr als ein grok Muster haben:

grok { 
    match => { 
     "message" => [ 
      "%{TIME}--%{DATA:source}--%{DATA:destination}--%{DATA:somedata}", 
      "%{TIME:timestamp}--%{GREEDYDATA:somedata}", 
      "%{GREEDYDATA:somedata}" 
     ] 
    } 
} 

Auch aus Chro Kommentar: der Grok Filter standardmäßig versuchen, die Muster in der Reihenfolge, wie sie geliefert werden, entsprechen. Wenn Sie also den dritten (den GREEDYDATA) zuerst eingeben, wird er einfach übereinstimmen und dann den Filter verlassen. Sie können festlegen, dass mehrere Muster mit der Einstellung break_on_match übereinstimmen, indem Sie sie auf false setzen (standardmäßig ist dies der Fall).


Mit Ihrem Update:

In Ihrem Fall, wenn Sie diese Zeilen haben:

timestamp source destination a=0,b=1,c=3,d=4 
timestamp a=1,e=5, b=1 
g=0 

und Sie wünschen, sonst die b und g Werte und nichts zu extrahieren, Sie haben um mehr als ein Muster zu verwenden, eins, um den b Wert zu ergreifen, das andere für den `g Wert:

match => message [ 
    "b=%{NUMBER:b}", 
    "g=%{NUMBER:g}" 
] 

Logstash verarbeitet die Logs Zeile für Zeile und die Ausgabe ist das Ergebnis des Prozesses, der in dieser Zeile ausgeführt wurde. Der Grokfilter versucht, Zeilen mit dem Muster zu analysieren und Feld hinzuzufügen, wenn das Parsing erfolgreich ist. Es fängt die Linien nicht ein.

+0

Um dies hinzuzufügen, wird der Grok-Filter standardmäßig versuchen, die Muster in der Reihenfolge, in der sie geliefert werden, abzugleichen. Wenn Sie also den dritten (den GREEDYDATA) zuerst eingeben, wird er einfach übereinstimmen und dann den Filter verlassen. Sie können mehrere Muster mit der Einstellung break_on_match kombinieren. – Chro

+0

@Chro Danke. Kann ich das zu meiner Antwort hinzufügen? – baudsp

+0

Sicher, bitte tun! – Chro