Graylog: Verwendung mit Python

Wie man Logs von Python zu Graylog sendet

👋 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 zu Graylog ist unkompliziert. In diesem Beispiel verwenden wir die Pakete graypy und logging, um dies zu erreichen.

Auf der Graylog-Seite müssen Sie ein GELF TCP-Input erstellen.

Gehen Sie zu Ihrem Graylog-Admin-Panel, dann zu "System"/"Inputs" und erstellen Sie ein neues "GELF TCP"-Input. Aktivieren Sie das Kästchen "global", fügen Sie einen "title" hinzu und stellen Sie sicher, dass der Port auf 12201 eingestellt ist.

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

Input-KonfigurationInput-Konfiguration

Gehen Sie im Stackhero-Dashboard zu Ihrem Graylog-Dienst und klicken Sie auf "Konfigurieren".

Stellen Sie sicher, dass der TCP-Port 12201 korrekt definiert ist und aktivieren Sie die "TLS-Verschlüsselung" dafür, dann bestätigen Sie Ihre Konfiguration.

Input-Port-KonfigurationInput-Port-Konfiguration

Sie sollten in der "Firewall" Ihres Dienstes überprüfen, dass Sie mindestens Ihre IP-Adresse zum Senden von Daten an den TCP-Port 12201 zugelassen haben. Für Testzwecke könnte es einfacher sein, alle IPs (0.0.0.0/0) zuzulassen, was die Standardeinstellung ist.

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

Dann können Sie den folgenden Code in eine Datei namens graylog-example.py schreiben und XXXXX.stackhero-network.com durch den Hostnamen Ihres Servers ersetzen:

import logging
import graypy

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

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

my_logger.debug('Dies ist ein Test von einem Python-Skript!')

Gehen Sie zu Ihrem Graylog-Admin-Panel, klicken Sie auf den "Search"-Tab, klicken Sie auf das Play-Symbol und wählen Sie "Update every 1 second". Dann können Sie das Skript mit diesem Befehl ausführen: python graylog-example.py.

Das Skript sendet das Log an Graylog, und Sie sollten es auf Ihrer Graylog-Suchseite sehen!

Ihr erstes Log auf Graylog empfangenIhr erstes Log auf Graylog empfangen

Klicken Sie auf den Satz "Dies ist ein Test von einem Python-Skript!" und Sie werden nützliche Informationen wie den Skriptnamen, die Zeile, die das Log erstellt, usw. sehen.

Detailliertes LogDetailliertes Log

Eine nützliche Funktion ist es, Fehler abzufangen und an Graylog zu senden, sodass Sie einen globalen Überblick über die von Ihrer Anwendung ausgelösten Fehler haben. Sie haben sogar die Möglichkeit, Benachrichtigungen über solche Fehler per E-Mail oder mit Slack oder Mattermost zu senden.

In diesem Beispiel versuchen wir, die Funktion unknown_function aufzurufen, die nicht existiert. Vergessen Sie nicht, den Wert "XXXXX.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('XXXXX.stackhero-network.com', 12201)
my_logger.addHandler(handler)

try:
  unknown_function()
except NameError:
  my_logger.debug('Die Funktion "unknown_function" hat einen Fehler ausgelöst', exc_info=1)

Führen Sie das Skript aus und kehren Sie zu Ihrem Graylog-Admin-Panel zurück. Sie werden den Fehler "NameError: name 'unknown_function' is not defined" und die vollständige Fehlerverfolgung sehen!

Beispiel für einen FehlerlogBeispiel für einen Fehlerlog

In den vorherigen Beispielen haben wir TLS verwendet, um die Kommunikation zu verschlüsseln, aber wir haben die Gültigkeit des Zertifikats nicht überprüft. Dies war zu Demonstrationszwecken, aber für die Produktion sollten Sie die Gültigkeit des Zertifikats überprüfen.

Sie können dies tun, indem Sie einfach die Optionen validate und ca_certs wie folgt hinzufügen:

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

Sie sollten sicherstellen, dass die Datei /etc/ssl/certs/ca-certificates.crt existiert:

  • Auf Ubuntu/Debian können Sie sie mit sudo apt install ca-certificates installieren.
  • Auf Alpine Linux installieren Sie sie mit apk add ca-certificates.
  • Auf macOS ist sie standardmäßig installiert, aber als /etc/ssl/cert.pem benannt.

Wenn Sie keine Logs in Ihrem Graylog erhalten, sollten Sie diese Punkte überprüfen:

  1. Graylog sollte ein definiertes Input vom Typ "GELF TCP" haben, das auf Port 12201 hört, ohne definierte TLS-Konfiguration.
  2. Die Graylog-Konfiguration im Stackhero-Dashboard (Schaltfläche "Konfigurieren") sollte den Port 12201 definiert haben, mit TCP und TLS aktiviert in "Input ports".
  3. Die Firewall im Stackhero-Dashboard sollte Ihnen den Port "12201/tcp" als "ACCEPT" anzeigen, idealerweise an Position #1 mit der Quelle 0.0.0.0/0 definiert (für Testzwecke).
  4. Sie sollten die Logs auf Ihrem Graylog-Admin-Panel in "Search" überwachen. Um sicherzustellen, dass Sie Ihre Logs sehen, wählen Sie "Search in the last 1 hour", klicken Sie auf das Play-Symbol und wählen Sie "Update every 1 second".