Collecte de logs avec NodeJS
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.
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: '/api/v2/logs?dd-api-key=<CLÉ_API_DATADOG>&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: '/api/v2/logs?dd-api-key=<CLÉ_API_DATADOG>&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
Documentation, liens et articles supplémentaires utiles: