Collecte de logs avec NodeJS
Rapport de recherche Datadog : Bilan sur l'adoption de l'informatique sans serveur Rapport : Bilan sur l'adoption de l'informatique sans serveur

Collecte de logs avec NodeJS

Configurer votre logger

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.json est mis à jour avec les dépendances correspondantes :

{
  "name": "...",

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

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"}

Associer votre service à l’ensemble des logs et traces

Si l’APM est activé pour cette application, associez vos logs et vos traces en ajoutant automatiquement l’ID des traces, l’ID des spans et les paramètres env, service et version à vos logs. Pour ce faire, suivez les instructions relatives à l’utilisation de NodeJS pour l’APM (en anglais).

Remarque : si le traceur de l’APM injecte service dans vos logs, cela remplace la valeur définie dans la configuration de l’Agent.

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 Logs
logs:

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

Logging sans agent

Vous pouvez transmettre vos logs depuis votre application à Datadog sans installer d’Agent sur votre host. Veuillez cependant noter qu’il est conseillé d’utiliser un Agent pour l’envoi de vos logs, en raison de ses capacités natives de gestion de la connexion.

Utilisez le transport HTTP Winston pour envoyer vos logs directement via l’API Log Datadog. Dans votre fichier Bootstrap ou dans votre code, déclarez le logger comme suit :

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

const httpTransportOptions = {
  host: 'http-intake.logs.datadoghq.com',
  path: '/v1/input/<CLÉ_API>?ddsource=nodejs&service=<NOM_APPLICATION>',
  ssl: true
};

const logger = createLogger({
  level: 'info',
  exitOnError: false,
  format: format.json(),
  transports: [
    new transports.Http(httpTransportOptions),
  ],
});

module.exports = logger;

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

Remarque : vous pouvez également tester le transport Datadog créé par la communauté.

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

const httpTransportOptions = {
  host: 'http-intake.logs.datadoghq.eu',
  path: '/v1/input/<CLÉ_API>?ddsource=nodejs&service=<NOM_APPLICATION>',
  ssl: true
};

const logger = createLogger({
  level: 'info',
  exitOnError: false,
  format: format.json(),
  transports: [
    new transports.Http(httpTransportOptions),
  ],
});

module.exports = logger;

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

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