Collecte de logs avec NodeJS
Pour envoyer vos logs à Datadog, activez la journalisation au sein d’un fichier et suivez ce fichier avec l’Agent Datadog. Utilisez la bibliothèque de journalisation Winston pour effectuer la journalisation depuis votre application Node.js.
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",
//...
}
}
Écrire les logs 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: '<LOGGER_NAME>',
filename: '<FILE_NAME>.log',
json: true,
level: 'info'
})
]
});
// Example logs
logger.log('info', 'Hello simple log!');
logger.info('Hello log with metas',{color: 'blue' });
Vérifiez le contenu du fichier <NOM_FICHIER>.log
pour vous assurer que Winston prend en charge la journalisation 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"}
Une fois la collecte de logs activée, configurez la collecte de logs personnalisée pour suivre vos fichiers de logs et les transmettre les nouveaux logs à Datadog.
- Créez un dossier
nodejs.d/
dans le répertoire de configuration de l’Agent conf.d/
. - Créez un fichier
conf.yaml
dans votre dossier nodejs.d/
avec le contenu suivant :
init_config:
instances:
##Log section
logs:
- type: file
path: "<FILE_NAME_PATH>.log"
service: <SERVICE_NAME>
source: nodejs
sourcecategory: sourcecode
- Redémarrez l’Agent.
- Lancez la sous-commande status de l’Agent et cherchez
nodejs
dans la section Checks
pour vérifier que les logs sont bien transmis à Datadog.
Si les logs sont au format JSON, Datadog parse automatiquement les messages de log pour extraire les attributs. Utilisez le Log Explorer pour visualiser et dépanner vos logs.
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 Node.js 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.
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.',
path: '/api/v2/logs?dd-api-key=<DATADOG_API_KEY>&ddsource=nodejs&service=<APPLICATION_NAME>',
ssl: true
};
const logger = createLogger({
level: 'info',
exitOnError: false,
format: format.json(),
transports: [
new transports.Http(httpTransportOptions),
],
});
module.exports = logger;
// Example logs
logger.log('info', 'Hello simple log!');
logger.info('Hello log with metas',{color: 'blue' });
Remarque : vous pouvez également utiliser le transport Datadog créé par la communauté.
Dépannage
Si jamais vous rencontrez des erreurs de correspondance DNS, 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: