Graylog: Utilisation avec Python

Comment envoyer des logs de Python à 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 à Graylog est un processus simple. Dans ce guide, nous allons vous montrer 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.

Accédez à votre panneau d'administration Graylog. Sous « System » > « Inputs », vous pouvez créer une nouvelle entrée de type « GELF TCP ». Assurez-vous de cocher la case « global », d'entrer un « title » pour votre entrée, et de vérifier que le port est bien réglé 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 et cliquez sur « Configurer ».

Assurez-vous que le port TCP 12201 est bien 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.

Ensuite, créez un fichier nommé graylog-example.py et remplacez <XXXXXX>.stackhero-network.com par le nom d'hôte de votre serveur. Voici un exemple de script que vous pouvez essayer :

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 de lecture et réglez la mise à jour sur chaque seconde. Vous pouvez lancer 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 verrez des informations utiles comme le nom du script et la ligne exacte qui a généré le log.

Détail du logDétail du log

Graylog ne sert pas uniquement à recevoir des messages de log classiques. Vous pouvez aussi 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 email, Slack ou Mattermost.

Voici un exemple où nous appelons volontairement une fonction inexistante pour générer une erreur. N'oubliez pas de 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 environnement de production, il est important 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, vous pouvez l'installer 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 vous ne voyez pas vos logs apparaître dans Graylog, voici quelques points à vérifier :

  1. Assurez-vous que Graylog dispose d'une entrée GELF TCP à l'écoute sur le port 12201, et que TLS n'est pas activé sur cette entrée.
  2. Dans le tableau de bord Stackhero, sous « Configurer », confirmez 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.