Anpassung von 1.6.x Protokollierungsagent zur Unterstützung von benutzerdefiniertem mehrzeiligem Parsing für Node.js Anwendungen, die Winston in nicht-orchestrierten Umgebungen verwenden

Dieses Tutorial zeigt, wie man die IBM® Cloud Logs Protokollierungsagent mehrzeilige Protokollierung für eine Node.js Anwendung mit der angepassten Winston Logging Library konfiguriert. Diese Konfiguration ist für nicht-orchestrierte Umgebungen gedacht, z. B. Linux und Windows, und ändert die Konfigurationsdatei. Diese Konfiguration stellt sicher, dass Stack Traces und mehrzeilige Logs in IBM Cloud Logs korrekt gruppiert werden.

Für dieses Tutorial ist die Website IBM Cloud Logs Protokollierungsagent 1.6.2 oder höher erforderlich.

Vorbereitende Schritte

Bevor Sie mit diesem Lernprogramm beginnen, sollten Sie die folgenden Informationen lesen, um die Konzepte von Protokollierungsagent und Multiline zu verstehen.

Diese Anleitung setzt außerdem voraus, dass Sie über die entsprechenden Kenntnisse verfügen:

  • Eine bereitgestellte und konfigurierte IBM Cloud Logs-Instanz.

  • Die Protokollierungsagent wurde in einer nicht-orchestrierten Umgebung eingesetzt.

Die Konfigurationsdateien in diesem Tutorial finden Sie dort, wo die Paketdateien bei der Installation von Protokollierungsagent heruntergeladen wurden.

Beispiel einer Winston-Konfiguration

Nehmen wir an, Ihre Anwendung Node.js verwendet Winston und protokolliert in folgendem Format auf der Konsole:

const winston = require('winston');

const logger = winston.createLogger({
  level: 'info',
  format: winston.format.combine(
    winston.format.timestamp({
      format: 'ddd MMM DD YYYY HH:mm:ss.SSS'
    }),
    winston.format.errors({ stack: true }),
    winston.format.printf(({ timestamp, level, message, stack }) => {
      const levelUpper = level.toUpperCase();
      const baseLog = `[${timestamp}] ${levelUpper} [Main] - ${message}`;
      if (stack) {
        return `${baseLog}\n${stack}`;
      }
      return baseLog;
    })
  ),
  transports: [
    new winston.transports.Console()
  ]
});

Dieses Format erzeugt Protokolleinträge, die mit einem Zeitstempel und einem Level beginnen, und mehrzeilige Protokolle, wie z. B. Fehler-Stacktraces, folgen in den nachfolgenden Zeilen ohne Zeitstempel.

Winston protokolliert in der Regel alle Ausgaben, einschließlich Fehler-Stacktraces, als eine einzige Zeichenkette, so dass ein mehrzeiliger Parser oft nicht erforderlich ist. Dieses Beispiel zeigt jedoch, was zu tun ist, wenn Ihr Formatierer mehrzeilige Protokolle ausgibt, und es hilft zu veranschaulichen, wie das mehrzeilige Parsing für jedes benutzerdefinierte Format anzugehen ist.

Diese Konfiguration dient als Beispiel, um zu zeigen, wie mehrzeilige Protokolle bei der Verwendung von benutzerdefinierten Protokollformatierungen behandelt werden können. Wenn Ihre Anwendung eine andere Struktur oder eine andere Protokollierungsbibliothek verwendet, verwenden Sie dies als Referenz, um Ihren eigenen mehrzeiligen Parser entsprechend zu erstellen.

Manuelle Konfiguration des mehrzeiligen Parsings mit Hilfe einer Konfigurationsdatei

Um Protokolle richtig zu gruppieren, definieren Sie einen mehrzeiligen Parser, der den Zeitstempel am Anfang neuer Protokolleinträge erkennt und nachfolgende Zeilen als Fortsetzungen der vorherigen Einträge behandelt.

Definieren Sie den mehrzeiligen Parser

Fügen Sie Folgendes zur Datei parsers.conf hinzu:

[MULTILINE_PARSER]
    Name            multiline-nodejs-winston
    Type            regex
    Flush_timeout   500
    Rule            "start_state"     "/^\\[[A-Z][a-z]{2} [A-Z][a-z]{2} \\d{2} \\d{4} \\d{2}:\\d{2}:\\d{2}\\.\\d{3}\\] .*$/"
    Rule            "cont"            "/^(?!\\[[A-Z][a-z]{2} [A-Z][a-z]{2} \\d{2} \\d{4} \\d{2}:\\d{2}:\\d{2}\\.\\d{3}\\] ).*$/"

Dieser Parser geht davon aus, dass die Protokolle mit einem Zeitstempel wie [Wed Jul 24 2025 14:52:31.456] ... beginnen. Stack Traces sind in den folgenden Zeilen eingerückt und entsprechen nicht der Zeitstempel-Regex, so dass sie mit der vorherigen Protokollzeile gruppiert werden.

Den Parser mit einem mehrzeiligen Filter anwenden

Fügen Sie einen Filterblock in die Datei filters.conf ein, um den Parser zu verwenden:

[FILTER]
    Name                  multiline
    Match                 kube.*
    Multiline.key_content log
    Multiline.parser      multiline-nodejs-winston

Starten Sie den Agenten erneut.

Starten Sie den Agenten nach der Aktualisierung der Konfigurationskarte neu.

  • Linux Für Linux Umgebungen, führen Sie:

    systemctl daemon-reload && systemctl restart fluent-bit
    
  • Windows Für Windows-Umgebungen, führen Sie:

    sc.exe stop fluent-bit && sc.exe start fluent-bit
    

Überprüfen Sie Ihre mehrzeiligen Protokolle

Rufen Sie Ihre Instanz IBM Cloud Logs auf und überprüfen Sie, ob Ihre mehrzeiligen Einträge (z. B. Stack Traces) korrekt gruppiert sind.

  1. Rufen Sie Ihre Instanz IBM Cloud Logs auf.

  2. Verwenden des Symbols „ Protokolle durchsuchen“ die Protokollansicht und überprüfen Sie, ob Ihre mehrzeiligen Einträge richtig gruppiert sind.

    Die gruppierten Protokolldaten werden in das Feld log aufgenommen.