Graylog: Utilisation avec Python

Comment envoyer des logs de Python 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 e-mail SMTP illimité et dédié inclus.
  • Mises à jour sans effort en un clic.
  • Nom de domaine personnalisable sécurisé avec HTTPS (par exemple, https://logs.votre-entreprise.com).
  • Performance optimale et sécurité robuste 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 Python vers Graylog est un processus simple. Dans ce guide, nous allons voir comment utiliser les packages graypy et logging pour transférer les logs de votre application Python vers votre instance Graylog.

Commencez par configurer une entrée GELF TCP sur votre serveur Graylog.

Rendez-vous sur le panneau d'administration Graylog. Dans "System" > "Inputs", créez une nouvelle entrée de type "GELF TCP". Cochez la case "global", saisissez un "title" pour votre entrée et vérifiez que le port est bien défini sur 12201.

Ne cochez aucune option TLS ici. Le chiffrement TLS sera géré par le reverse proxy inclus avec votre instance.

Configuration de l'entréeConfiguration de l'entrée

Dans le tableau de bord Stackhero, sélectionnez votre service Graylog puis cliquez sur "Configurer".

Vérifiez que le port TCP 12201 est correctement configuré et que le "chiffrement TLS" est activé pour ce port. Enregistrez vos modifications pour appliquer la configuration.

Configuration du port d'entréeConfiguration du port d'entrée

Vérifiez dans le "Firewall" de votre service que vous avez autorisé au moins votre IP à envoyer des données vers le port TCP 12201. Pour les tests, il peut être plus simple d'autoriser toutes les IPs (0.0.0.0/0), ce qui est la configuration par défaut.

Pour cet exemple, vous pouvez utiliser la bibliothèque graypy. Pour commencer, installez-la simplement avec pip install graypy.

Créez ensuite un fichier nommé graylog-example.py et remplacez <XXXXXX>.stackhero-network.com par le nom d'hôte de votre serveur. Voici un script d'exemple à tester :

import logging
import graypy

my_logger = logging.getLogger('test_logger')
my_logger.setLevel(logging.DEBUG)

handler = graypy.GELFTLSHandler('<XXXXXX>.stackhero-network.com', 12201)
my_logger.addHandler(handler)

my_logger.debug('This is a test from a Python script!')

Pour consulter vos logs, ouvrez le panneau d'administration Graylog, allez dans l'onglet "Search", cliquez sur l'icône lecture et réglez la mise à jour sur chaque seconde. Lancez votre script avec :

python graylog-example.py

Une fois le script exécuté, votre message de log sera envoyé à Graylog et vous devriez le voir apparaître dans les résultats de recherche.

Premier log reçu sur GraylogPremier log reçu sur Graylog

En cliquant sur le message "This is a test from a Python script!", vous accéderez à des informations utiles comme le nom du script et la ligne exacte ayant généré le log.

Détail du logDétail du log

Graylog ne sert pas uniquement aux messages de log classiques. Vous pouvez également capturer et transmettre les erreurs pour mieux suivre le comportement de votre application. Cela facilite la surveillance et la réception de notifications en cas de problème, par e-mail, Slack ou Mattermost.

Voici un exemple où nous appelons volontairement une fonction inexistante pour générer une erreur. Pensez à remplacer "<XXXXXX>.stackhero-network.com" par le nom d'hôte de votre instance.

import logging
import graypy

my_logger = logging.getLogger('test_logger')
my_logger.setLevel(logging.DEBUG)

handler = graypy.GELFTLSHandler('<XXXXXX>.stackhero-network.com', 12201)
my_logger.addHandler(handler)

try:
    unknown_function()
except NameError:
    my_logger.debug('The "unknown_function" raised an error', exc_info=1)

Vous pouvez exécuter ce script comme précédemment. Dans le panneau d'administration Graylog, vous verrez le message d'erreur "NameError: name 'unknown_function' is not defined" accompagné de la stack trace complète.

Exemple de log d'erreurExemple de log d'erreur

Bien que les exemples précédents utilisent le chiffrement TLS, ils ne valident pas le certificat. Cela convient pour les tests, mais en production, il est essentiel de vérifier la validité du certificat.

Vous pouvez activer la validation du certificat en ajoutant les options validate et ca_certs comme ceci :

handler = graypy.GELFTLSHandler('<XXXXXX>.stackhero-network.com', 12201, validate=True, ca_certs='/etc/ssl/certs/ca-certificates.crt')

Assurez-vous que le fichier /etc/ssl/certs/ca-certificates.crt existe sur votre système :

  • Sur Ubuntu/Debian, installez-le avec sudo apt install ca-certificates.
  • Sur Alpine Linux, installez-le avec apk add ca-certificates.
  • Sur macOS, il est installé par défaut, mais le fichier s'appelle /etc/ssl/cert.pem.

Si vos logs n'apparaissent pas dans Graylog, voici quelques points à vérifier :

  1. Vérifiez que Graylog dispose d'une entrée GELF TCP écoutant sur le port 12201 et que TLS n'est pas activé sur cette entrée.
  2. Dans le tableau de bord Stackhero, sous "Configurer", assurez-vous que le port 12201 est bien configuré en TCP avec TLS activé dans "Input ports".
  3. Vérifiez que les paramètres du firewall dans Stackhero affichent le port "12201/tcp" en "ACCEPT", idéalement en première position avec la source 0.0.0.0/0 pour les tests.
  4. Dans le panneau d'administration Graylog, sous "Search", assurez-vous d'afficher les logs de la dernière heure et réglez la vue pour se mettre à jour chaque seconde afin de voir les nouveaux messages dès leur arrivée.