Unterstützung von mehrzeiligen Protokollen für die Protokollierungsagent in orchestrierten Umgebungen

Fehler und Stack Traces können sich über mehrere Zeilen erstrecken, wobei jede Zeile als separater Protokolleintrag gesendet wird. Um die Aufnahme von mehrzeiligen Protokollen durch IBM® Cloud Logs aus Anwendungen wie Java oder Python zu unterstützen, die in orchestrierten Umgebungen wie Red Hat OpenShift on IBM Cloud oder IBM Cloud Kubernetes Service laufen, müssen Sie Änderungen an der Konfiguration von Protokollierungsagent vornehmen. Zu den Änderungen gehört das Parsing, das erforderlich ist, um Protokollzeilen zu gruppieren, die als ein einziger Protokolleintrag zusammengefasst werden sollen.

Über Multiline

In den Clustern OpenShift und Kubernetes erfasst das Protokollierungssystem die Protokolle der Anwendungsströme stdout und stderr. Anschließend wird jeder Protokollzeile ein Präfix mit Metadaten vorangestellt, bevor die Protokolle in Dateien gespeichert werden, die dem Container Runtime Interface (CRI) Protokollierungsformat entsprechen.

Dieses Kubernetes Log-Zeilenpräfix enthält:

  • Zeitstempel: Im Format ISO 8601.
  • Streamname: stdout oder stderr.
  • Tag: F oder P.

Das CRI-Protokollierungsformat verwendet Tags, um zu definieren, ob eine Protokollzeile eine einzelne Zeile oder ein mehrzeiliger Protokolleintrag ist. Gültige Werte für das Tag sind:

  • Teilweise (P): Dieses Tag ist in Protokollzeilen enthalten, die das Ergebnis der Aufteilung einer einzelnen Protokollzeile in mehrere Zeilen durch die Laufzeit sind und der Protokolleintrag noch nicht beendet ist.
  • Vollständig (F): Dieses Tag wird verwendet, um anzuzeigen, dass der Protokolleintrag abgeschlossen ist. Es wird für eine einzelne Protokollzeile verwendet oder um anzuzeigen, dass es sich um die letzte Zeile eines mehrzeiligen Eintrags handelt.
2024-03-15T10:30:45.123456789Z stdout F This is a complete log line
2024-03-15T10:30:45.123456789Z stderr P This is the first part of a
2024-03-15T10:30:45.123456789Z stderr F multiline error message

Standardmäßig enthält Protokollierungsagent die Konfiguration von Tail plugin mit dem mehrzeiligen Parser cri, um die Verkettung dieser CRI-formatierten Protokolle von stdout und stderr in einer einzigen Protokollzeile zu unterstützen.

Es wird empfohlen, in Kubernetes-Umgebungen, die CRI-basierte Protokollierung verwenden, die Einstellung Multiline.Parser (standardmäßig auf cri eingestellt) zu verwenden, um von den Containern erzeugte mehrzeilige Protokolle korrekt zu analysieren und wieder zusammenzusetzen.

Möglicherweise haben Sie auch Anwendungen wie Java oder Python, bei denen sich Fehler und Stack Traces über mehrere Zeilen erstrecken können, wobei jede Zeile als separater Protokolleintrag gesendet wird. Diese Anwendungen können mehrere Protokollzeilen erzeugen, die miteinander zu einer einzigen Protokollzeile verbunden werden können. Um diese mehrzeiligen Protokolle über die Protokollierungsagent zu verarbeiten, müssen Sie eine zusätzliche Multiline parser konfigurieren.

Standardmäßige mehrzeilige Konfiguration

Die standardmäßige mehrzeilige Konfiguration für CRI-Protokolle wird konfiguriert und aktiviert, wenn Sie die Protokollierungsagent bereitstellen.

In Fluent Bit können Sie Multiline parser konfigurieren, indem Sie den eingebauten mehrzeiligen Parser oder einen eigenen mehrzeiligen Parser verwenden.

Standardmäßig wird Tail plugin, das mit Protokollierungsagent konfiguriert ist, mit dem eingebauten mehrzeiligen Parser cri konfiguriert. Dieser Parser verarbeitet Protokolle, die von der CRI-O Container-Engine erzeugt werden, und unterstützt die Verkettung von Protokolleinträgen.

Die Protokollierungsagent hat zum Beispiel diese Standardkonfiguration für die Unterstützung von Mehrzeilern:

    [INPUT]
        Name              tail
        Tag               kube.*
        .....
        Buffer_Chunk_Size 32KB
        Buffer_Max_Size   256KB
        Multiline.parser  cri
        Skip_Long_Lines   On
        Refresh_Interval  10
        storage.type      filesystem
        storage.pause_on_chunks_overlimit on

Konfigurieren zusätzlicher mehrzeiliger Unterstützung für Anwendungen

Wenn Sie Anwendungen wie Java oder Python haben, bei denen sich Fehler und Stack Traces über mehrere Zeilen erstrecken können und jede Zeile als separater Protokolleintrag gesendet wird, müssen Sie den Multiline Parser in Protokollierungsagent konfigurieren.

Wählen Sie eine der folgenden Optionen, um Protokollierungsagent mit dem Multiline-Parser zu konfigurieren:

Hinzufügen eines benutzerdefinierten mehrzeiligen Parsers

Um einen benutzerdefinierten mehrzeiligen Parser für die Verwendung mit Protokollierungsagent zu erstellen, folgen Sie den Anweisungen in Konfigurierbare mehrzeilige Parser. Sie werden eine benutzerdefinierte Regex definieren, um das mehrzeilige Muster zu bestimmen.

Die Konfiguration von Protokollierungsagent muss auch ein FILTER nach dem Plug-in INPUT enthalten. Der Filter wird das Muster des konfigurierten MULTILINE_PARSER anwenden. Der Wert Name der MULTILINE_PARSER muss mit dem Wert Multiline.parser in der FILTER übereinstimmen.

filter-multiline.conf: |
    [FILTER]
        Name              multiline
        Match             *
        Multiline.parser  INSERT_CUSTOM_PARSER_NAME
        Multiline.key_content log

Hinzufügen von mehrzeiliger Unterstützung für Anwendungen

Wenn Sie Protokollierungsagent einsetzen und Anwendungen wie Java oder Python verwenden, bei denen sich Fehler und Stack Traces über mehrere Zeilen erstrecken können und jede Zeile als separater Protokolleintrag gesendet wird, können Sie Ihre Agentenkonfiguration aktualisieren und den Multiline-Parser konfigurieren.

Führen Sie die folgenden Schritte aus, um die Mehrzeilenunterstützung in Protokollierungsagent hinzuzufügen:

  1. Melden Sie sich am Cluster an. Weitere Informationen finden Sie unter Zugriff auf Ihren Cluster.

  2. Fügen Sie in der Protokollierungsagent config map (inputs.conf) den Multiline Parser hinzu.

    In der Konfiguration von Protokollierungsagent muss @INCLUDE für den Multiline-Filter direkt hinter dem Eingangs-Plug-in stehen.

    fluent-bit.conf: |
    [SERVICE]
      Flush                   1
      Log_Level               info
      Daemon                  off
      Parsers_File            parsers.conf
      Plugins_File            plugins.conf
    
      ...
    
    
    @INCLUDE input-kubernetes.conf
    @INCLUDE filter-multiline.conf
    
    ...
    
    input-kubernetes.conf: |
    [INPUT]
        Name              tail
        Tag               kube.*
        .....
        Buffer_Chunk_Size 32KB
        Buffer_Max_Size   256KB
        Multiline.parser  cri
        Skip_Long_Lines   On
        Refresh_Interval  10
        storage.type      filesystem
        storage.pause_on_chunks_overlimit on
    
    filter-multiline.conf: |
    [FILTER]
        Name              multiline
        Match             *
        Multiline.parser  multiline-java-example
        Multiline.key_content log
    
    parsers.conf: |
    ...
    [MULTILINE_PARSER]
        Name            multiline-java-example
        Type            regex
        Flush_timeout   500
        Rule            "start_state"     "/^(\d+-\d+-\d+ \d+:\d+:\d+\.\d+)(.*)$/"     "cont"
        Rule            "cont"            "/^(?!\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}\.\d{3}).*$/"     "cont"
    ...
    
  3. Starten Sie die Agent-Pods neu.

    Bei Kubernetes Clustern führen Sie aus:

    kubectl -n ibm-observe rollout restart ds/logs-agent
    

    Bei OpenShift Clustern führen Sie aus:

    oc -n ibm-observe rollout restart ds/logs-agent
    

Konfigurieren der Mehrzeilenunterstützung für Cluster mit mehreren Laufzeiten und Parsing-Anforderungen

Wenn Sie Cluster haben, in denen Anwendungen mit mehreren verschiedenen Sprachen oder Laufzeiten laufen (z. B. Java, Go und Python ), müssen Sie möglicherweise mehrzeilige Protokolle aus verschiedenen Quellen verarbeiten. Wenn Sie bereits einen benutzerdefinierten mehrzeiligen Parser für Java haben, können Sie ihn mit eingebauten Parsern für andere Laufzeiten wie Go und Python kombinieren. Dadurch wird sichergestellt, dass alle Protokolle korrekt geparst und als korrekt gruppierte Einträge an IBM® Cloud Logs weitergeleitet werden.

Wenn Sie mehrere Parser (integrierte und benutzerdefinierte) in einer durch Komma getrennten Liste angeben, versucht Protokollierungsagent jeden Parser nacheinander, bis eine Übereinstimmung gefunden wird.

Konfiguration von mehreren Parsern mit Helm

Wenn Sie Helm verwenden, um Ihre orchestrierte Umgebung zu konfigurieren, aktualisieren Sie den Abschnitt multilinePreprocessor, um sowohl auf integrierte Parser (z. B. go, python) als auch auf Ihre benutzerdefinierten Parser in einer kommagetrennten Liste zu verweisen.

Zum Beispiel:

multilinePreprocessor:
  - name: multiline
    multiline.parser: go, python, nodejs, ruby, multiline-java-example, multiline-nodejs-winston
    multiline.key_content: log

Wenn Sie eine frühere Version von Protokollierungsagent installiert haben und die Agentenkonfiguration durch Änderung der config map direkt im Cluster aktualisiert haben, erstellen Sie eine Kopie Ihrer config map aus dem Cluster, bevor Sie den Befehl helm upgrade ausführen. Wenn die Protokollierungsagent aktualisiert wird, werden alle an der Config Map vorgenommenen Änderungen überschrieben.

Nachdem Sie die Datei values.yaml aktualisiert haben, führen Sie helm upgrade aus, um die Änderungen zu übernehmen. Überprüfen Sie Ihre Konfiguration, indem Sie die Protokolle verschiedener Laufzeiten in IBM Cloud Logs überprüfen, um sicherzustellen, dass die mehrzeilige Gruppierung in allen Konfigurationen funktioniert.

Weitere Informationen und Beispiele

Weitere Informationen und Tutorials mit Beispielszenarien zur Konfiguration der Mehrzeilenverarbeitung finden Sie in den folgenden Themen.

Zusätzliche Ressourcen für die Protokollierungsagent Mehrzeilenverarbeitung
Weitere Informationen zu Siehe
Konfigurieren der mehrzeiligen Unterstützung für die Protokollierungsagent in Linux Thema
Konfigurieren der mehrzeiligen Unterstützung für Protokollierungsagent in Windows Thema
Mehrzeiliges Parsing für Java Anwendungen mit Log4j Lernprogramm
Mehrzeiliges Parsing mit Helm für Java Anwendungen mit Log4j Lernprogramm
Mehrzeiliges Parsing für Node.js Anwendungen mit Winston Lernprogramm
Mehrzeiliges Parsing mit Helm für Node.js Anwendungen mit Winston Lernprogramm