Nouvelles annonces sur les technologies sans serveur et réseau ainsi que sur le RUM (Real-User Monitoring) dévoilées à la conférence Dash ! Nouvelles annonces dévoilées à la conférence Dash !

Collecte de logs avec NodeJS

Présentation

Utilisez Winston pour la création de logs depuis votre application NodeJS afin de profiter de toutes les fonctionnalités dont vous avez besoin pour élaborer votre stratégie de journalisation.

Winston est disponible via NPM. Pour démarrer, vous devez ajouter la dépendance à votre code :

npm install --save winston

package.js est mis à jour avec les dépendances correspondantes :

{
  "name": "...",

  //...
  "dependencies": {
    //...
    "winston": "x.y.z",
    //...
  }
}

Implémentation

Ajouter des identifiants de trace à vos logs

Si l’APM est activé pour cette application et que vous souhaitez améliorer la corrélation entre les traces et les logs d’application, suivez les instructions de journalisation NodeJS pour l’APM afin d’ajouter automatiquement des identifiants de trace et de span à vos logs.

Journalisation dans un fichier

Dans votre fichier Bootstrap ou dans votre code, déclarez le logger comme suit :

const { createLogger, format, transports } = require('winston');

const logger = createLogger({
  level: 'info',
  exitOnError: false,
  format: format.json(),
  transports: [
    new transports.File({ filename: `${appRoot}/logs/<NOM_FICHIER>.log` }),
  ],
});

module.exports = logger;

// Exemple de logs
logger.log('info', 'Voici un log simple');
logger.info('Voici un log avec des métadonnées',{color: 'blue' });
var winston = require('winston');

var logger = new (winston.Logger)({
    transports: [
        new (winston.transports.File)({
            name: '<NOM_LOGGER>',
            filename: '<NOM_FICHIER>.log',
      json: true,
            level: 'info'
        })
    ]
});

// Example logs
logger.log('info', 'Voici un log simple');
logger.info('Voici un log avec des métadonnées',{color: 'blue' });

Vérifiez le contenu du fichier <NOM_FICHIER>.log pour vous assurer que Winston prend déjà en charge la journalisation de tous les éléments en JSON :

{"level":"info","message":"Voici un log simple","timestamp":"2015-04-23T16:52:05.337Z"}
{"color":"blue","level":"info","message":"Voici un log avec des métadonnées","timestamp":"2015-04-23T16:52:05.339Z"}

Configurer votre Agent Datadog

Créez un fichier nodejs.d/conf.yaml dans votre dossier conf.d/ avec le contenu suivant :

init_config:

instances:

##Section Log
logs:

    ## - type (obligatoire) : type de fichier de la source d'entrée de log (tcp/udp/file).
    ##   port / path (obligatoire) : définit le type tcp ou udp du port. Choisit le chemin si le type est défini sur file.
    ##   service (obligatoire) : nom du service propriétaire du log.
    ##   source (obligatoire) : attribut qui définit l'intégration qui envoie les logs.
    ##   sourcecategory (facultatif) : attribut à valeur multiple. Il peut être utilisé pour préciser l'attribut source.
    ##   tags (facultatif) : ajoute des tags à chaque log recueilli.

  - type: file
    path: <NOM_CHEMIN_FICHIER>.log
    service: nodejs
    source: nodejs
    sourcecategory: sourcecode

Dépannage

Si jamais vous rencontrez des erreurs de correspondance DNS ou si votre application plante, il se peut que ce problème découle des exceptions logstash non détectées. Un gestionnaire doit être ajouté comme suit :

var logstash = new winston.transports.Logstash({ ... });
logstash.on('error', function(err) {
    console.error(err); // remplacer par vos propres fonctionnalités ici
});

Assurez-vous de ne pas définir le paramètre max_connect_retries sur 1 (valeur par défaut : 4).

Pour aller plus loin