Graylog: Verwendung mit Python

Wie Sie Logs von Python an Graylog senden

👋 Willkommen bei der Stackhero-Dokumentation!

Stackhero bietet eine einsatzbereite Graylog Cloud-Lösung, die zahlreiche Vorteile bietet, darunter:

  • Unbegrenzter und dedizierter SMTP-E-Mail-Server inklusive.
  • Mühelose Updates mit nur einem Klick.
  • Anpassbarer Domainname gesichert mit HTTPS (zum Beispiel, https://logs.ihre-firma.com).
  • Optimale Performance und robuste Sicherheit durch eine private und dedizierte VM.

Sparen Sie Zeit und vereinfachen Sie Ihr Leben: Es dauert nur 5 Minuten, um die Graylog Cloud Hosting-Lösung von Stackhero auszuprobieren!

Das Senden von Logs von Python an Graylog ist ein unkomplizierter Prozess. In dieser Anleitung zeigen wir Ihnen, wie Sie mit den Paketen graypy und logging Logs aus Ihrer Python-Anwendung an Ihre Graylog-Instanz weiterleiten können.

Zunächst sollten Sie auf Ihrem Graylog-Server einen GELF TCP Input konfigurieren.

Öffnen Sie das Graylog-Admin-Panel. Unter "System" > "Inputs" können Sie einen neuen Input vom Typ "GELF TCP" anlegen. Aktivieren Sie das Kontrollkästchen "global", vergeben Sie einen "title" für Ihren Input und stellen Sie sicher, dass der Port auf 12201 gesetzt ist.

Aktivieren Sie keine TLS-Option an dieser Stelle. Die TLS-Verschlüsselung wird vom Reverse Proxy Ihrer Instanz übernommen.

Input-KonfigurationInput-Konfiguration

Wählen Sie im Stackhero-Dashboard Ihren Graylog-Dienst aus und klicken Sie auf "Konfigurieren".

Stellen Sie sicher, dass der TCP-Port 12201 korrekt eingerichtet ist und dass für diesen Port "TLS-Verschlüsselung" aktiviert ist. Speichern Sie Ihre Änderungen, um die Konfiguration zu übernehmen.

Input-Port-KonfigurationInput-Port-Konfiguration

Überprüfen Sie in der "Firewall" Ihres Dienstes, dass mindestens Ihre eigene IP-Adresse berechtigt ist, Daten an den TCP-Port 12201 zu senden. Für Testzwecke ist es oft einfacher, alle IPs (0.0.0.0/0) zuzulassen – dies ist die Standardeinstellung.

Für dieses Beispiel können Sie die graypy-Bibliothek verwenden. Installieren Sie sie einfach mit pip install graypy.

Erstellen Sie anschließend eine Datei namens graylog-example.py und ersetzen Sie <XXXXXX>.stackhero-network.com durch den Hostnamen Ihres eigenen Servers. Hier ein Beispielskript, das Sie ausprobieren können:

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!')

Um Ihre Logs einzusehen, öffnen Sie das Graylog-Admin-Panel, wechseln Sie zum Tab "Search", klicken Sie auf das Play-Symbol und stellen Sie das Update-Intervall auf jede Sekunde. Führen Sie Ihr Skript mit folgendem Befehl aus:

python graylog-example.py

Sobald das Skript ausgeführt wird, wird Ihre Log-Nachricht an Graylog gesendet und sollte in den Suchergebnissen erscheinen.

Ihr erstes Log in Graylog empfangenIhr erstes Log in Graylog empfangen

Wenn Sie auf die Nachricht "This is a test from a Python script!" klicken, erhalten Sie nützliche Details wie den Namen des Skripts und die exakte Zeile, die das Log erzeugt hat.

Detailliertes LogDetailliertes Log

Graylog ist nicht nur für reguläre Log-Nachrichten geeignet. Sie können auch Fehler abfangen und weiterleiten, um einen besseren Einblick in das Verhalten Ihrer Anwendung zu erhalten. So wird es einfacher, Probleme zu überwachen und Benachrichtigungen per E-Mail, Slack oder Mattermost zu erhalten.

Hier ein Beispiel, bei dem absichtlich eine nicht existierende Funktion aufgerufen wird, um einen Fehler zu erzeugen. Denken Sie daran, "<XXXXXX>.stackhero-network.com" durch den Hostnamen Ihrer Instanz zu ersetzen.

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)

Sie können dieses Skript wie zuvor ausführen. Im Graylog-Admin-Panel sehen Sie dann die Fehlermeldung "NameError: name 'unknown_function' is not defined" zusammen mit dem vollständigen Stacktrace.

Beispiel für ein Fehler-LogBeispiel für ein Fehler-Log

Die bisherigen Beispiele nutzen zwar TLS-Verschlüsselung, führen jedoch keine Zertifikatsvalidierung durch. Für Tests ist das ausreichend, aber in einer Produktionsumgebung sollten Sie unbedingt die Gültigkeit des Zertifikats prüfen.

Sie können die Zertifikatsvalidierung aktivieren, indem Sie die Optionen validate und ca_certs wie folgt hinzufügen:

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

Stellen Sie sicher, dass die Datei /etc/ssl/certs/ca-certificates.crt auf Ihrem System vorhanden ist:

  • Unter Ubuntu/Debian können Sie sie mit sudo apt install ca-certificates installieren.
  • Unter Alpine Linux mit apk add ca-certificates.
  • Unter macOS ist sie standardmäßig installiert, die Datei heißt dort jedoch /etc/ssl/cert.pem.

Sollten Ihre Logs nicht in Graylog erscheinen, prüfen Sie bitte Folgendes:

  1. Stellen Sie sicher, dass Graylog einen GELF TCP Input auf Port 12201 bereitstellt und dass TLS auf diesem Input nicht aktiviert ist.
  2. Überprüfen Sie im Stackhero-Dashboard unter "Konfigurieren", dass Port 12201 als TCP mit aktiviertem TLS unter "Input ports" eingerichtet ist.
  3. Kontrollieren Sie, dass die Firewall-Einstellungen in Stackhero den Port "12201/tcp" auf "ACCEPT" setzen, idealerweise an Position #1 mit der Quelle 0.0.0.0/0 für Testzwecke.
  4. Im Graylog-Admin-Panel unter "Search" sollten Sie sicherstellen, dass Sie Logs der letzten Stunde anzeigen und die Ansicht auf Aktualisierung jede Sekunde stellen, um neue Nachrichten sofort zu sehen.