Personalizzazione di 1.6.x Agent di registrazione per supportare l'analisi multilinea personalizzata per le applicazioni Node.js che utilizzano Winston in ambienti orchestrati

Questa esercitazione mostra come configurare la gestione dei registri multilinea di IBM® Cloud Logs Agent di registrazione per un'applicazione Node.js utilizzando la libreria di registrazione Winston personalizzata. Questa configurazione è per gli ambienti orchestrati, ad esempio IBM Cloud Kubernetes Service e Red Hat OpenShift on IBM Cloud, e utilizza Helm. Questa configurazione assicura che le tracce dello stack e i log multilinea siano raggruppati correttamente in IBM Cloud Logs.

Questa esercitazione richiede il programma IBM Cloud Logs Agent di registrazione 1.6.0 o successivo.

Prima di iniziare

Prima di iniziare a utilizzare questa esercitazione, si consiglia di leggere le seguenti informazioni per comprendere i concetti di Agent di registrazione e multilinea.

Questa esercitazione presuppone anche che siate in possesso di:

Esempio di configurazione Winston

Supponiamo che l'applicazione Node.js utilizzi Winston e registri nella console nel seguente formato:

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()
  ]
});

Questo formato produce voci di registro che iniziano con un timestamp e un livello, mentre i registri multilinea, come le tracce dello stack di errori, seguono su righe successive senza timestamp.

Winston in genere registra tutto l'output, comprese le tracce di stack degli errori, come una singola stringa, quindi spesso non è necessario un parser multilinea. Tuttavia, questo esempio dimostra cosa fare se il formattatore stampa log multilinea e illustra come affrontare il parsing multilinea per qualsiasi formato personalizzato.

Questa configurazione è fornita come esempio per mostrare come gestire i registri multilinea quando si usa la formattazione personalizzata dei registri. Se l'applicazione utilizza una struttura o una libreria di log diversa, usare questo come riferimento per creare il proprio parser multilinea di conseguenza.

Configurazione dell'analisi multilinea con Helm

Se si distribuisce Agent di registrazione usando Helm, si può configurare l'analisi multilinea nel file Helm values.yaml.

Abilita l'analisi multilinea

Impostare enableMultiline su true nel file values.yaml per attivare l'elaborazione multilinea:

enableMultiline: true

Definire il parser multilinea

Aggiungere un parser multilinea personalizzato nella sezione additionalMultilineParsers del file values.yaml.

È importante che lo schema definito nel file log4j.xml sia in linea con la regex del parser multilinea per garantire un corretto raggruppamento dei registri.

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

La regex presuppone che ogni nuova riga di log inizi con un timestamp nel formato ddd MMM DD YYYY HH:mm:ss.SSS. La prima regola cattura le righe iniziali con i timestamp e passa a uno stato di continuazione. La seconda regola corrisponde a qualsiasi riga che non inizia con un timestamp.

Questo approccio è solo un esempio per mostrare come garantire che le righe di log multilinea siano raggruppate come una singola voce di log prima di inoltrarle a IBM Cloud Logs. Ci sono diversi modi per ottenere la stessa cosa.

Applicare il parser in un preprocessore

Configurare un preprocessore nella sezione multilinePreprocessor per applicare il parser ai log.

Ad esempio:

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

Applicare le modifiche.

Se è stata installata una versione precedente di Agent di registrazione e si è aggiornata la configurazione dell'agente modificando la mappa di configurazione direttamente nel cluster, eseguire una copia della mappa di configurazione dal cluster prima di eseguire il comando helm upgrade. Quando il sito Agent di registrazione viene aggiornato, le modifiche apportate alla mappa di configurazione vengono sovrascritte.

Dopo aver aggiornato il file values.yaml, applicare le modifiche eseguendo il seguente comando sull'installazione client. In questo modo si rigenerano le configurazioni necessarie.

helm upgrade

Verificare i log multilinea

Accedere all'istanza di IBM Cloud Logs e verificare che le voci multilinea (ad esempio, le tracce di stack) siano raggruppate correttamente.

  1. Accedere all'istanza IBM Cloud Logs.

  2. Utilizzando la vista Registri Icona Esplora registri, verificare che le voci multilinea siano raggruppate correttamente.