Logstash Multiline Filter konfigurieren – Der komplette Leitfaden

Logstash Multiline Filter konfigurieren – Der komplette Leitfaden
  • Der Multiline Filter fasst mehrzeilige Logs wie Java-Stacktraces zu einem Ereignis zusammen – unverzichtbar für saubere Analysen.
  • Wichtige Parameter: pattern, negate, what, stream_identity, max_lines und max_bytes.
  • Mit negate => true erkennen Sie neue Ereignisse anhand ihres Starts – robuster als jede Fortsetzungslogik.
  • Platzieren Sie den Filter immer vor Grok und anderen Filtern, sonst funktioniert die Gruppierung nicht.
  • Bei mehreren Logquellen unbedingt stream_identity setzen, um falsche Kombinationen zu vermeiden.

Warum der Multiline Filter in Logstash so wichtig ist

Logdateien sind das Gedächtnis Ihrer IT-Infrastruktur – doch oft sind sie chaotisch. Stacktraces, Exception-Meldungen oder mehrzeilige SQL-Queries zerstören die Struktur Ihrer Logs und machen eine saubere Analyse nahezu unmöglich. Der Logstash Multiline Filter ist die Lösung: Er fasst zusammengehörige Zeilen zu einem einzigen logischen Ereignis zusammen. In diesem praxisorientierten Leitfaden zeige ich Ihnen Schritt für Schritt, wie Sie den Multiline Filter in Logstash korrekt konfigurieren – mit konkreten Beispielen, die Sie sofort in Ihrer eigenen Umgebung einsetzen können.

Kurz gesagt :

  • Multiline Filter fasst mehrzeilige Logs (z. B. Java-Stacktraces) zu einem Ereignis zusammen.
  • Kernparameter: pattern, negate, what, stream_identity, max_lines, max_bytes.
  • negate => true erkennt neue Ereignisse anhand ihres Starts – robuster als Fortsetzungslogik.
  • Filter muss vor Grok platziert werden; bei mehreren Quellen stream_identity setzen.

Was ist der Multiline Filter und wie funktioniert er?

Der Multiline Filter arbeitet als Puffer, der eingehende Logzeilen sammelt und erst dann ein Ereignis erzeugt, wenn eine bestimmte Bedingung erfüllt ist. Er unterscheidet dabei zwischen Fortsetzungszeilen und neuen Ereignissen. Typische Anwendungsfälle sind Java-Stacktraces, PostgreSQL-Fehlerprotokolle oder Apache Error Logs. Die wichtigsten Parameter sind pattern, negate, what, stream_identity, max_lines und max_bytes.

Die Kernfunktion ist denkbar einfach: Sie definieren ein Muster, das entweder den Beginn eines neuen Ereignisses oder eine Fortsetzungszeile erkennt. Der Filter puffert dann alle Zeilen, bis das Ereignis abgeschlossen ist. Das klingt simpel, aber die Praxis zeigt: Die Konfiguration hat einige Tücken.

  • pattern: Regulärer Ausdruck zur Erkennung von Zeilen (Pflicht)
  • negate: Kehrt die Logik um, Standardwert false
  • what: previous oder next – bestimmt die Zuordnung (Pflicht)
  • stream_identity: Identifiziert den Logstrom, z.B. bei mehreren Dateien
  • max_lines: Maximale Zeilen pro Ereignis, Standard 500
  • max_bytes: Maximale Größe eines Ereignisses, Standard 10 MB

Wie konfiguriere ich die Grundstruktur?

Die minimale Grundstruktur für Java-Stacktraces sieht so aus: pattern => “^\s+at “, negate => false, what => “previous”. Das Muster erkennt Zeilen, die mit Leerzeichen und “at ” beginnen – typisch für Stacktrace-Frames.

Hier ist ein vollständiges Beispiel:

filter { multiline { pattern => "^\s+at " negate => false what => "previous" }
}

Wenn Sie auch “Caused by”-Zeilen einbeziehen möchten, erweitern Sie das Muster: pattern => “^\s+at |^Caused by: “. Das funktioniert zuverlässig für die meisten Java-Exceptions.

Wie nutze ich die Negation für robuste Erkennung?

Die Negation (negate => true) ist ein mächtiges Werkzeug, wenn Sie Ereignisse anhand ihres Starts erkennen möchten, anstatt anhand der Fortsetzungszeilen. Ein typisches Szenario sind Logs mit Datumsstempel am Anfang jeder neuen Meldung.

Bei Apache Error Logs verwenden Sie beispielsweise pattern => “^\[\d{2}/\w{3}/\d{4}”, negate => true, what => “previous”. Alle Zeilen, die nicht mit einem Datum beginnen, werden dem vorherigen Ereignis zugeordnet. Das ist robuster, weil Sie nicht jedes mögliche Fortsetzungsformat kennen müssen.

Ich persönlich bevorzuge diese Methode, weil sie weniger fehleranfällig ist. Sie müssen nur den Start eines Ereignisses definieren – den Rest erledigt Logstash automatisch.

Wie konfiguriere ich mehrere Multiline-Filter für unterschiedliche Formate?

In der Praxis verarbeiten Sie oft verschiedene Logformate in einer Pipeline. Verwenden Sie if-Bedingungen, um die Filter zu trennen. Die Reihenfolge ist entscheidend: Der erste passende Filter wird angewendet.

filter { if [type] == "java" { multiline { pattern => "^\s+at " negate => false what => "previous" } } else if [type] == "custom" { multiline { pattern => "^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}" negate => true what => "previous" } }
}

Sie können auch Tags hinzufügen, um die Herkunft der Events nachzuvollziehen. Das erleichtert die spätere Analyse in Kibana.

Wie optimiere ich die Performance mit stream_identity und Limits?

Bei mehreren Logquellen oder großen Dateien müssen Sie die Performance im Blick behalten. Ohne stream_identity betrachtet Logstash alle Zeilen als einen Strom – das führt zu falschen Kombinationen.

Setzen Sie stream_identity auf eine eindeutige Kombination aus Host und Pfad: stream_identity => “%{host}.%{path}”. Das verhindert, dass Zeilen aus verschiedenen Dateien vermischt werden.

Zusätzlich sollten Sie Limits setzen: max_lines => 1000 und max_bytes => 2048000 (2 MB). Das schützt vor Speicherproblemen bei sehr großen Ereignissen.

Empfohlene Werte für Multiline-Parameter
ParameterStandardwertEmpfehlung für Produktion
max_lines5001000 (bei großen Stacktraces)
max_bytes10 MB2 MB (wenn Speicher knapp)
stream_identityDateipfad“%{host}.%{path}”

Wie teste ich die Konfiguration?

Bevor Sie in Produktion gehen, testen Sie gründlich. Logstash bietet dafür Tools: bin/logstash –config.test_and_exit prüft die Syntax, und Sie können mit stdin testen.

  • Syntaxprüfung: bin/logstash –config.test_and_exit -f /etc/logstash/conf.d/multiline.conf
  • Test mit Beispieldaten: cat test.log | bin/logstash -f multiline.conf
  • Debug-Modus: bin/logstash –debug für detaillierte Ausgaben

Ich empfehle, immer mit einem kleinen Beispieldatensatz zu testen, der alle möglichen Zeilenarten abdeckt. So sehen Sie sofort, ob die Gruppierung korrekt ist.

Wie integriere ich den Multiline Filter in meine Monitoring-Strategie?

Der Multiline Filter ist Teil eines ELK-Stacks. Platzieren Sie ihn vor dem Grok-Filter, damit die mehrzeiligen Ereignisse zuerst zusammengeführt werden. Nutzen Sie tägliche Indizes in Elasticsearch und visualisieren Sie die Events in Kibana.

Wenn Sie Filebeat als Shipper verwenden, können Sie die Multiline-Verarbeitung auch direkt in Filebeat konfigurieren – das entlastet Logstash bei hohem Logvolumen. Die Syntax ist ähnlich, aber Sie sparen einen Netzwerk-Hop.

Ein Beispiel für die Integration in eine komplette Pipeline:

filter { multiline { pattern => "^\s+at |^Caused by: " negate => false what => "previous" } grok { match => { "message" => "%{TIMESTAMP_ISO8601:timestamp} %{LOGLEVEL:level}: %{GREEDYDATA:message_content}" } } date { match => ["timestamp", "ISO8601"] }
}

Häufige Fehler und wie Sie sie vermeiden

Falsche Pattern-Logik ist der häufigste Fehler. Testen Sie Ihre regulären Ausdrücke mit Rubular. Achten Sie auf Escape-Sequenzen und Anker. Ein weiterer Klassiker: der falsche what-Parameter. Bei 95% der Fälle verwenden Sie what => “previous”.

Fehlt stream_identity bei mehreren Quellen, kombiniert Logstash Zeilen fälschlich. Definieren Sie immer eine eindeutige Identität. Und: Platzieren Sie den Multiline Filter immer an erster Stelle im Filter-Block, sonst funktioniert die Gruppierung nicht.

Performance-Probleme treten bei großen Logdateien auf. Setzen Sie Limits und erwägen Sie, die Verarbeitung nach Filebeat zu verlagern.

Häufig gestellte Fragen (FAQ)

Wie erkenne ich, ob mein Multiline Filter korrekt funktioniert?

Überprüfen Sie die Ausgabe in Elasticsearch oder im stdout-Output. Jedes logische Ereignis sollte als ein Dokument erscheinen. Sie können auch die Logstash-API nutzen: curl localhost:9600/_node/stats.

Kann ich mehrere Multiline-Filter gleichzeitig verwenden?

Ja, aber nur mit Bedingungen (if/else), um verschiedene Logformate zu unterscheiden. Ohne Bedingungen überschreiben sie sich gegenseitig.

Was ist der Unterschied zwischen negate => true und false?

Bei negate => false werden Zeilen, die dem Pattern entsprechen, dem vorherigen/nächsten Ereignis zugeordnet. Bei negate => true werden Zeilen, die nicht dem Pattern entsprechen, zugeordnet.

Wie kann ich die maximale Größe eines Multiline-Events erhöhen?

Verwenden Sie max_bytes. Der Standardwert ist 10 MB. Beispiel: max_bytes => 20971520 (20 MB).

Funktioniert der Multiline Filter auch mit JSON-Logs?

Ja, aber Sie müssen das Pattern anpassen. Oft ist es einfacher, bei JSON-Logs auf den Multiline Filter zu verzichten und stattdessen den JSON-Filter zu verwenden.

Fazit

Der Logstash Multiline Filter ist ein unverzichtbares Werkzeug für jede ernsthafte Log-Analyse. Mit der richtigen Konfiguration verwandeln Sie chaotische, mehrzeilige Logdaten in strukturierte, analysierbare Events. Die wichtigsten Erkenntnisse aus diesem Leitfaden: Verstehen Sie die Logik von pattern, negate und what. Testen Sie Ihre Konfiguration gründlich. Und setzen Sie stream_identity bei mehreren Quellen. Dann steht einer sauberen Log-Analyse nichts mehr im Weg.

Anna Berger
Anna Berger
IT-Sicherheitsanalystin und Tech-Journalistin

Schon als Kind war ich fasziniert von der Logik hinter Computern und der unendlichen Welt der Daten. Was als spielerische Neugier mit dem Zerlegen alter PCs begann, entwickelte sich schnell zu einer tiefen Leidenschaft für die Informatik. Heute sehe ich es als meine Berufung, komplexe digitale Themen greifbar zu …

Tous les articles de Anna Berger →

Laisser un commentaire