Anpassung von 1.6.x Protokollierungsagent zur Unterstützung benutzerdefinierter mehrzeiliger Analysen für Node.js Anwendungen mit Winston in orchestrierten Umgebungen

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 orchestrierte Umgebungen, zum Beispiel IBM Cloud Kubernetes Service und Red Hat OpenShift on IBM Cloud, und verwendet Helm. 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.0 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:

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 Protokollformaten 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.

Konfigurieren des mehrzeiligen Parsing mit Helm

Wenn Sie Protokollierungsagent mit Helm bereitstellen, können Sie die mehrzeilige Analyse in der Datei Helm values.yaml konfigurieren.

Mehrzeiliges Parsing einschalten

Setzen Sie enableMultiline in Ihrer Datei values.yaml auf true, um die mehrzeilige Verarbeitung zu aktivieren:

enableMultiline: true

Definieren Sie den mehrzeiligen Parser

Fügen Sie einen benutzerdefinierten mehrzeiligen Parser unter dem Abschnitt additionalMultilineParsers in Ihrer Datei values.yaml hinzu.

Es ist wichtig, dass das in der Datei log4j.xml definierte Muster mit der Regex im mehrzeiligen Parser übereinstimmt, um eine korrekte Protokollgruppierung zu gewährleisten.

additionalMultilineParsers:
  - name: multiline-nodejs-winston
    type: regex
    flush_timeout: 500
    rules:
      - state: start_state
        regex: '/^\[[A-Z][a-z]{2} [A-Z][a-z]{2} \d{2} \d{4} \d{2}:\d{2}:\d{2}\.\d{3}\] .*$/'
        next_state: cont
      - state: cont
        regex: '/^(?!\[[A-Z][a-z]{2} [A-Z][a-z]{2} \d{2} \d{4} \d{2}:\d{2}:\d{2}\.\d{3}\] ).*$/'
        next_state: cont

Die Regex geht davon aus, dass jede neue Protokollzeile mit einem Zeitstempel im Format ddd MMM DD YYYY HH:mm:ss.SSS beginnt. Die erste Regel erfasst Anfangszeilen mit Zeitstempeln und geht in einen Fortsetzungszustand über. Die zweite Regel entspricht jeder Zeile, die nicht mit einem Zeitstempel beginnt.

Dieser Ansatz ist nur ein Beispiel, um Ihnen zu zeigen, wie Sie sicherstellen können, dass mehrzeilige Protokolleinträge als ein einziger Protokolleintrag gruppiert werden, bevor sie an IBM Cloud Logs weitergeleitet werden. Es gibt verschiedene Möglichkeiten, das Gleiche zu erreichen.

Anwendung des Parsers in einem Präprozessor

Konfigurieren Sie einen Präprozessor im Abschnitt multilinePreprocessor, um den Parser auf Ihre Protokolle anzuwenden.

Zum Beispiel:

multilinePreprocessor:
  - name: multiline
    multiline.parser: multiline-nodejs-winston
    multiline.key_content: log

Wenden Sie die Änderungen an.

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, wenden Sie die Änderungen an, indem Sie die folgenden Schritte für Ihre Bereitstellung ausführen. Dadurch werden die erforderlichen Konfigurationen neu erstellt.

helm upgrade

Ü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.