Personnalisation de 1.6.x Agent de journalisation pour prendre en charge l'analyse multiligne personnalisée pour Node.js les applications utilisant Winston dans des environnements orchestrés

Ce tutoriel montre comment configurer la gestion des journaux multilignes de IBM® Cloud Logs Agent de journalisation pour une application Node.js utilisant la bibliothèque de journalisation Winston personnalisée. Cette configuration est destinée aux environnements orchestrés, par exemple IBM Cloud Kubernetes Service et Red Hat OpenShift on IBM Cloud, et utilise Helm. Cette configuration garantit que les traces de pile et les journaux multilignes sont correctement regroupés sur IBM Cloud Logs.

Ce tutoriel nécessite le logiciel IBM Cloud Logs Agent de journalisation 1.6.0 ou une version ultérieure.

Avant de commencer

Avant de commencer à utiliser ce didacticiel, passez en revue les informations suivantes pour comprendre les concepts de Agent de journalisation et de multilignes.

Ce tutoriel suppose également que vous avez :

Exemple de configuration de Winston

Supposons que votre application Node.js utilise Winston et enregistre les données dans la console au format suivant :

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

Ce format produit des entrées de journal qui commencent par un horodatage et un niveau, et des journaux multilignes, tels que les traces de pile d'erreur, qui suivent sur les lignes suivantes sans horodatage.

Winston enregistre généralement toutes les données de sortie, y compris les traces d'erreur, sous la forme d'une seule chaîne de caractères, de sorte qu'un analyseur multiligne n'est souvent pas nécessaire. Cependant, cet exemple montre ce qu'il faut faire si votre formateur imprime des journaux multilignes, et il permet d'illustrer la manière d'aborder l'analyse multiligne pour n'importe quel format personnalisé.

Cette configuration est fournie à titre d'exemple pour montrer comment gérer les journaux multilignes lors de l'utilisation d'un formatage personnalisé des journaux. Si votre application utilise une structure ou une bibliothèque de journalisation différente, utilisez-la comme référence pour créer votre propre analyseur multiligne en conséquence.

Configuration de l'analyse syntaxique multiligne avec Helm

Si vous déployez le site Agent de journalisation à l'aide de Helm, vous pouvez configurer l'analyse multiligne dans le fichier Helm values.yaml.

Activer l'analyse multiligne

Définissez enableMultiline à true dans votre fichier values.yaml pour activer le traitement multiligne :

enableMultiline: true

Définir l'analyseur multi-lignes

Ajoutez un analyseur multiligne personnalisé sous la section additionalMultilineParsers dans votre fichier values.yaml.

Il est important que le motif défini dans le fichier log4j.xml corresponde à l'expression rationnelle de l'analyseur multiligne afin de garantir un regroupement correct des journaux.

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

L'expression rationnelle suppose que chaque nouvelle ligne de journal commence par un horodatage au format ddd MMM DD YYYY HH:mm:ss.SSS. La première règle capture les lignes de départ avec des horodatages et passe à un état de continuation. La deuxième règle s'applique à toute ligne ne commençant pas par un horodatage.

Cette approche n'est qu'un exemple pour vous montrer comment faire en sorte que les lignes de journal multiples soient regroupées en une seule entrée de journal avant de les transmettre à IBM Cloud Logs. Il existe différentes manières de réaliser la même chose.

Appliquer l'analyseur dans un préprocesseur

Configurez un préprocesseur dans la section multilinePreprocessor pour appliquer l'analyseur à vos journaux.

Exemple :

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

Appliquez les modifications.

Si vous avez installé une version précédente de Agent de journalisation et que vous avez mis à jour la configuration de l'agent en modifiant la carte de configuration directement dans le cluster, faites une copie de votre carte de configuration à partir du cluster avant d'exécuter la commande helm upgrade. Lorsque le site Agent de journalisation est mis à jour, toutes les modifications apportées à la carte de configuration sont écrasées.

Après avoir mis à jour le fichier values.yaml, appliquez les modifications en exécutant ce qui suit sur votre déploiement. Cela régénérera les configurations nécessaires.

helm upgrade

Vérifiez vos journaux multilignes

Accédez à votre instance IBM Cloud Logs et confirmez que vos entrées multilignes (par exemple, les traces de pile) sont regroupées correctement.

  1. Accédez à votre instance IBM Cloud Logs.

  2. En utilisant la vue Journaux Icône d'exploration des journaux, vérifiez que vos entrées multilignes sont correctement groupées.