Wie gehe ich mit Logstash mit mehreren heterogenen Eingaben um?

95

Angenommen, Sie haben zwei sehr unterschiedliche Arten von Protokollen, z. B. technische und geschäftliche Protokolle, und Sie möchten:

  • Technische Rohprotokolle werden mithilfe einer gelfAusgabe an einen Graylog2-Server weitergeleitet.
  • JSON-Geschäftsprotokolle werden mithilfe der dedizierten elasticsearch_httpAusgabe in einem Elasticsearch-Cluster gespeichert .

Ich weiß, dass mit Syslog-NGder Konfigurationsdatei beispielsweise mehrere unterschiedliche Eingaben definiert werden können, die dann vor dem Versand separat verarbeitet werden können. was Logstashscheint unfähig zu tun. Selbst wenn eine Instanz mit zwei spezifischen Konfigurationsdateien initiiert werden kann, verwenden alle Protokolle denselben Kanal und werden auf dieselbe Weise angewendet ...

Sollte ich so viele Instanzen ausführen, wie ich verschiedene Arten von Protokollen habe?

David
quelle
2
Sie sollten die richtige Antwort von Ben Lim akzeptieren!
Ben Wheeler

Antworten:

191

Sollte ich so viele Instanzen ausführen, wie ich verschiedene Arten von Protokollen habe?

Nein! Sie können nur eine Instanz ausführen, um verschiedene Protokolltypen zu verarbeiten.

In der Logstash-Konfigurationsdatei können Sie jede Eingabe mit einem anderen Typ angeben . Dann können Sie im Filter if verwenden, um unterschiedliche Verarbeitungen zu unterscheiden, und am Ausgang können Sie die if-Ausgabe an unterschiedliche Ziele verwenden.

input {
    file {
            type => "technical"
            path => "/home/technical/log"
    }
    file {
            type => "business"
            path => "/home/business/log"
    }
} 
filter {
    if [type] == "technical" {
            # processing .......
    }
    if [type] == "business" {
            # processing .......
    }
}
output {
    if [type] == "technical" {
            # output to gelf
    }
    if [type] == "business" {
            # output to elasticsearch
    }
}

Hoffe das kann dir helfen :)

Ben Lim
quelle
1
Sie können das typeAttribut (mit derselben type => "value"Syntax) auch in den Filter- und Ausgabedefinitionen verwenden, wodurch die zusätzliche Formatierung in der Konfigurationsdatei etwas reduziert werden sollte. Beispiel: gist.github.com/fairchild/3030472 Pro Dokumentation: Fügen Sie allen Ereignissen, die von dieser Eingabe verarbeitet werden, ein Feld 'Typ' hinzu. Typen werden hauptsächlich zur Filteraktivierung verwendet. Der Typ wird als Teil des Ereignisses selbst gespeichert, sodass Sie den Typ auch verwenden können, um in der Weboberfläche danach zu suchen.
Tony Cesaro
5
Nun, es sieht so aus, als ob das, was Ben zur Verfügung gestellt hat, tatsächlich der neue Weg ist, dies zu tun. Bei Verwendung type => "value"in einer Ausgabe wurde die folgende Meldung angezeigt: "Sie verwenden eine veraltete Konfigurationseinstellung" Typ ", die in stdout festgelegt ist. Veraltete Einstellungen funktionieren weiterhin, sollen jedoch in Zukunft aus dem Protokoll entfernt werden. Dies können Sie erreichen das gleiche Verhalten mit den neuen Bedingungen, wie: if [type] == "sometype" { stdout { ... } }" Ich ziehe meinen vorherigen Kommentar zurück. :)
Tony Cesaro
Beachten Sie, dass das typeAttribut nicht angewendet wird, wenn die Eingabe bereits ein Typfeld enthält. Dies ist ein spezielles Attribut, das nicht überschrieben und dokumentiert wird. Ich habe ein Ticket in Elastic geöffnet und sie haben mir empfohlen, tagsoder add_fieldanstelle vontype
BornToCode
@BornToCode, ich verstehe nicht ganz. Wollen Sie damit sagen, dass mit Bens Code etwas nicht stimmt? Oder dass es nicht funktionieren würde, wenn die Protokollpfade dieselbe Datei wären? Was ist das Szenario, in dem es nicht funktioniert?
Ben Wheeler
2
@ BenLim Das OP hat Ihre Antwort nicht akzeptiert, aber ich fand sie am hilfreichsten und habe Sie positiv bewertet.
Bigbadmouse
15

Ich habe Tags für die Eingabe mehrerer Dateien verwendet:

input {
    file {
        type => "java"
        path => "/usr/aaa/logs/stdout.log"
        codec => multiline {
            ...
        },
        tags => ["aaa"]
    }

    file {
        type => "java"
        path => "/usr/bbb/logs/stdout.log"
        codec => multiline {
                ...
        }
        tags => ["bbb"]
    }
}
output {
    stdout {
        codec => rubydebug
    }
    if "aaa" in [tags] {
        elasticsearch {
            hosts => ["192.168.100.211:9200"]
            index => "aaa"
            document_type => "aaa-%{+YYYY.MM.dd}"
        }
    }

    if "bbb" in [tags] {
        elasticsearch {
            hosts => ["192.168.100.211:9200"]
            index => "bbb"
            document_type => "bbb-%{+YYYY.MM.dd}"
        }
    }
}
Robin Wang
quelle
Dies ist besser als die akzeptierte Antwort: Es ermöglicht mehrere Filebeat-Eingaben in Logstash. In solchen Fällen wird die Eigenschaft "Typ" auf "Protokoll" gesetzt und kann nicht geändert werden.
Régis B.
Aber überschreibt das nicht Tags mit dem letzten Tag (bbb)? Und wenn im if-Status die Tags ein Array oder eine einzelne Zeichenfolge wären, würden beide IFs funktionieren. Logischerweise ist dies falsch, aber vielleicht hat Logstash eine andere Logik in if's
meso_2600
0

Ich denke, logstash kann nicht mehr als 2 Dateien im Eingabebereich lesen. Versuchen Sie das Folgende

input {
    file {
            type => "technical"
            path => "/home/technical/log"
    }
    file {
            type => "business"
            path => "/home/business/log"
    }
 file {
            type => "business1"
            path => "/home/business/log1"
    }
} 
KM Prak
quelle
Ja,
stoße