Graylog: Utilisation avec Node.js

Comment envoyer des logs de Node.js vers Graylog

👋 Bienvenue sur la documentation de Stackhero !

Stackhero propose une solution Graylog cloud prête à l'emploi qui offre de nombreux avantages, notamment :

  • Serveur SMTP d'e-mail dédié et illimité inclus.
  • Mises à jour simplifiées en un clic.
  • Nom de domaine personnalisable sécurisé par HTTPS (par exemple, https://logs.votre-entreprise.com).
  • Performance optimale et sécurité renforcée grâce à une VM privée et dédiée.

Gagnez du temps et simplifiez-vous la vie : il suffit de 5 minutes pour essayer la solution Graylog cloud hosting de Stackhero !

Envoyer des logs de Node.js vers Graylog est très simple. Dans cet exemple, vous allez voir comment utiliser le package graylog2 pour rendre ce processus fluide.

Pour commencer, installez le package en exécutant la commande suivante :

npm install graylog2

Voici comment l'utiliser pour enregistrer des messages :

const graylog2 = require('graylog2');
const crypto = require('crypto');

const logger = new graylog2.graylog({
  servers: [{ host: '<XXXXXX>.stackhero-network.com', port: 12201 }] // Pensez à remplacer "host" par votre domaine Graylog
});

// Envoyer un message simple à Graylog
logger.log('Simple message example');

// Ajouter des données à un message
logger.log(
  'Password recovery email', // Message
  // Un objet JSON avec des détails supplémentaires
  {
    subject: 'Password recovery',
    language: 'en_US',
    domain: 'gmail.com'
  }
);

// Exemple avancé
const ip = '1.2.3.4';
const ipHash = crypto.createHash('md5').update(ip).digest('hex');

const userId = '1234';
const userIdHash = crypto.createHash('md5').update(userId).digest('hex');

logger.log(
  'API request', // Message
  // Un objet JSON avec plus de détails
  {
    route: '/v1/messages/1234/',
    method: 'POST',

    responseTime: 12, // ms
    responseCode: 200,

    ipHash,
    userIdHash
  }
);

// Logger les exceptions non interceptées dans Node.js
process.on(
  'uncaughtException',
  err => {
    logger.log(
      err,
      { type: 'uncaughtException' }
    );
  }
);

Pour plus d'exemples, vous pouvez consulter ce dépôt GitHub.

warning N'oubliez pas de configurer votre input Graylog (voir détails ci-dessous).

warning Il est préférable d'utiliser le package graylog2 sauf si Winston fait déjà partie de votre projet. Dans ce cas, vous pouvez le remplacer par winston-gelf.

Pour installer le package Winston GELF, exécutez :

npm install winston-gelf

Si Winston n'est pas déjà dans votre projet, ajoutez-le avec :

npm install winston

Voici une configuration de base :

const winston = require('winston');
const winstonGelf = require('winston-gelf');
const process = require('process');

const logger = winston.createLogger({
  transports: [
    new winston.transports.Console(),
    new winstonGelf({
      // Consultez toutes les options gelfPro ici : https://www.npmjs.com/package/gelf-pro
      gelfPro: {
        fields: {
          env: process.env.NODE_ENV || 'development'
        },
        adapterName: 'udp',
        adapterOptions: {
          host: '<XXXXXX>.stackhero-network.com', // Remplacez par votre domaine Graylog
          port: 12201,
        }
      }
    })
  ]
});

// Exemple de log informatif
logger.info('This is a log information');

// Exemple de log d'erreur
try {
  throw Error('This is an example error');
}
catch(error) {
  logger.warn({ message: 'Error triggered', error });
}

N'oubliez pas de configurer votre input Graylog (voir détails ci-dessous).

Sur l'interface Graylog, allez dans System/Inputs, créez un nouvel input de type "GELF UDP" et cliquez sur "Launch new input". Dans la fenêtre qui s'affiche, cochez "Global", ajoutez un titre et validez sans modifier les autres paramètres.

C'est tout ! Votre Graylog est maintenant prêt à recevoir les logs de votre application Node.js.

Pour renforcer la sécurité, pensez à filtrer les IPs autorisées à envoyer des données sur le port 12201. Pour cela, rendez-vous sur le tableau de bord Stackhero, sélectionnez votre service Graylog et configurez le "Firewall" pour n'autoriser que vos IPs.