Zentrales Logging mit rsyslog: Logs mehrerer Server konsolidieren
AI generated
$
/etc
Linux
Zentrales Logging mit rsyslog
Logs mehrerer Server konsolidieren

Wer Magento Shops auf mehreren Applikationsservern betreibt, kennt das Problem: Ein Fehler taucht irgendwo zwischen Loadbalancer, Nginx, PHP-FPM und Datenbankserver auf, und die relevanten Zeilen liegen verteilt auf drei oder vier verschiedenen Maschinen. rsyslog löst dieses Problem, indem es Logs mehrerer Server über das Netzwerk an einen zentralen Server weiterleitet, dort konsolidiert und für die Auswertung an einem einzigen Ort verfügbar macht, wahlweise verschlüsselt und mit Zustellgarantie.

10 Min. Lesezeit Linux rsyslog Logging

1. Warum verteilte Logs im Ernstfall zum Problem werden

In einer typischen Magento Infrastruktur mit mehreren Applikationsservern hinter einem Loadbalancer entstehen Logs an vielen verschiedenen Stellen gleichzeitig: Nginx Access Logs auf jedem Frontend, PHP-FPM Error Logs auf jedem App-Server, dazu Datenbank- und Cache-Logs auf separaten Maschinen. Wenn ein Kunde einen Fehler meldet, weiß niemand vorab, auf welchem der Server die relevante Zeile tatsächlich liegt, und ein manuelles Durchsuchen von vier oder fünf Servern per SSH kostet in einem Vorfall wertvolle Zeit.

Zentrales Logging verschiebt diesen Aufwand von der Suchphase in die Sammelphase: Statt im Ernstfall auf jedem Server einzeln nach der passenden Zeitmarke zu suchen, liegen alle Log Zeilen bereits chronologisch sortiert an einem Ort vor. rsyslog eignet sich dafür besonders gut, weil es auf praktisch jeder Linux Distribution bereits als Standard Syslog Daemon installiert ist und weder ein zusätzliches Agenten Deployment noch eine externe Abhängigkeit benötigt, um als Sammelstelle zu fungieren.

2. Die Modul Architektur von rsyslog verstehen

rsyslog ist intern strikt in Input, Parser, Filter und Output Module aufgeteilt, die über eine Verarbeitungspipeline miteinander verbunden werden. Input Module, deren Namen mit im beginnen, nehmen Nachrichten entgegen, etwa imuxsock für den lokalen Unix Socket, imjournal für den Import aus dem systemd Journal, oder imtcp und imudp für Nachrichten, die über das Netzwerk eintreffen.

Output Module, deren Namen mit om beginnen, entscheiden, was mit einer Nachricht am Ende der Pipeline passiert. omfile schreibt in lokale Dateien, omfwd leitet Nachrichten an einen anderen Syslog Server weiter, und spezialisierte Module wie omelasticsearch senden direkt an externe Systeme. Zwischen Input und Output sitzen Rulesets und Warteschlangen, die bestimmen, welche Nachricht welchen Weg durch die Pipeline nimmt.


# Aktuell geladene rsyslog Konfiguration validieren, ohne den Daemon zu starten
rsyslogd -N1

# Aktive Module und deren Reihenfolge aus der Konfiguration extrahieren
grep -r "module(load=" /etc/rsyslog.conf /etc/rsyslog.d/

3. Einen zentralen rsyslog Server einrichten

Der zentrale Server benötigt zunächst ein aktiviertes Input Modul für eingehende Netzwerkverbindungen. Für TCP ist das imtcp, das im Gegensatz zu UDP eine zuverlässige, verbindungsorientierte Zustellung garantiert und deshalb für produktives zentrales Logging fast immer die richtige Wahl ist, weil einzelne UDP Pakete bei Netzwerklast stillschweigend verloren gehen können.

Damit die eingehenden Logs nicht alle in einer einzigen Datei landen, definiert eine Template Direktive den Zieldateipfad dynamisch anhand von Hostname und Programmname der jeweiligen Nachricht. So entsteht pro sendendem Server automatisch eine eigene, klar benannte Verzeichnisstruktur, ohne dass jeder Client einzeln konfiguriert werden muss.


# /etc/rsyslog.d/10-central-receiver.conf auf dem zentralen Server
module(load="imtcp")
input(type="imtcp" port="514" streamdriver.mode="0")

template(name="PerHostLog" type="string"
  string="/var/log/central/%HOSTNAME%/%programname%.log")

if $inputname == "imtcp" then {
  action(type="omfile" dynaFile="PerHostLog")
  stop
}

4. Clients für die Weiterleitung an den zentralen Server einrichten

Auf jedem Applikationsserver reicht eine kurze Zusatzkonfiguration, die alle lokal empfangenen Nachrichten zusätzlich über omfwd an den zentralen Server weiterleitet. Wichtig ist die Reihenfolge der Actions: Die Weiterleitung sollte vor einer eventuellen lokalen Filterung stehen, damit auch Nachrichten, die lokal verworfen werden, zentral erhalten bleiben.

rsyslog puffert ausgehende Nachrichten standardmäßig im Arbeitsspeicher. Bei einer kurzzeitigen Netzwerkunterbrechung zum zentralen Server gehen diese Nachrichten dadurch verloren, sobald der Puffer voll läuft. Für produktive Umgebungen empfiehlt sich deshalb eine disk unterstützte Warteschlange, die Nachrichten bei Bedarf temporär auf die lokale Festplatte auslagert, statt sie zu verwerfen.


# /etc/rsyslog.d/60-forward-central.conf auf jedem Applikationsserver
action(type="omfwd"
  target="log-central.internal" port="514" protocol="tcp"
  queue.type="LinkedList"
  queue.filename="fwd_central"
  queue.maxdiskspace="1g"
  queue.saveonshutdown="on"
  action.resumeRetryCount="-1")

5. TLS Verschlüsselung für den Log Transport aktivieren

Unverschlüsseltes Syslog über das Netzwerk bedeutet, dass Log Inhalte, darunter potenziell Session-IDs, IP-Adressen oder Fehlerdetails aus PHP-Stacktraces, im Klartext über das Netz laufen. rsyslog unterstützt TLS über den GnuTLS oder OpenSSL Stream Treiber und verschlüsselt die Verbindung zwischen Client und zentralem Server vollständig, inklusive optionaler Zertifikatsprüfung auf beiden Seiten.

Für den produktiven Einsatz empfiehlt sich eine eigene kleine Zertifizierungsstelle, deren Zertifikat auf allen beteiligten Servern hinterlegt wird. Der zentrale Server präsentiert ein Serverzertifikat, jeder Client validiert dieses gegen das CA-Zertifikat, und optional verlangt der Server umgekehrt ein gültiges Client Zertifikat, bevor er Verbindungen überhaupt annimmt.


# Serverseitig: TLS erzwingen und Client Zertifikate verlangen
module(load="imtcp"
  StreamDriver.Name="gtls"
  StreamDriver.Mode="1"
  StreamDriver.AuthMode="x509/name")
global(
  DefaultNetstreamDriverCAFile="/etc/rsyslog.d/tls/ca.pem"
  DefaultNetstreamDriverCertFile="/etc/rsyslog.d/tls/server-cert.pem"
  DefaultNetstreamDriverKeyFile="/etc/rsyslog.d/tls/server-key.pem")
input(type="imtcp" port="6514")

6. Vergleich zu journald Forwarding

Alternativ zu rsyslog bietet systemd mit systemd-journal-upload und systemd-journal-remote einen eigenen Weg, Journal Einträge über HTTP oder HTTPS an einen zentralen Server zu übertragen. Der Vorteil liegt in der nativen Integration mit strukturierten Journal Feldern, die als JSON übertragen werden und dabei zusätzliche Metadaten wie Boot-ID oder Unit-Namen behalten, die im klassischen Syslog Format verloren gehen.

Der Nachteil ist die geringere Verbreitung und Reife im Vergleich zu rsyslog: Weniger Distributionen aktivieren die Journal Remote Pakete standardmäßig, die Konfiguration über HTTPS Zertifikate ist weniger dokumentiert, und die Filterfähigkeiten am zentralen Empfänger sind eingeschränkter als das flexible Ruleset System von rsyslog. In gemischten Umgebungen mit Nginx, PHP-FPM und älteren Anwendungen, die klassisch nach Syslog schreiben, bleibt rsyslog deshalb meist die pragmatischere Wahl.

7. Praxisbeispiel: Nginx und PHP-FPM Logs zentralisieren

Nginx und PHP-FPM schreiben standardmäßig in lokale Dateien statt direkt nach Syslog. Um diese Logs in die zentrale Sammlung einzubeziehen, überwacht imfile die entsprechenden Dateien wie tail -f und speist neue Zeilen als Syslog Nachrichten in die rsyslog Pipeline ein, inklusive Zustands Tracking, damit nach einem Neustart kein Inhalt doppelt eingelesen wird.

Für die spätere Auswertung lohnt es sich, Nginx auf ein strukturiertes JSON Log Format umzustellen, statt das Standardformat zu verwenden. So lassen sich Statuscode, Request-Zeit und Upstream-Antwortzeit direkt als durchsuchbare Felder weiterverarbeiten, statt sie später mit fehleranfälligen regulären Ausdrücken aus einer Textzeile zu extrahieren.


# /etc/rsyslog.d/20-nginx-phpfpm-input.conf
module(load="imfile")

input(type="imfile"
  File="/var/log/nginx/access.log"
  Tag="nginx-access"
  Severity="info"
  Facility="local1")

input(type="imfile"
  File="/var/log/php-fpm/www-error.log"
  Tag="php-fpm"
  Severity="err"
  Facility="local2")

8. Performance und Warteschlangen Tuning bei hohem Log Aufkommen

Bei mehreren tausend Requests pro Sekunde auf einem Magento Shop kann das Log Volumen selbst zu einer spürbaren Last werden. rsyslog verarbeitet Nachrichten standardmäßig in mehreren parallelen Worker-Threads pro Warteschlange, deren Anzahl sich über queue.workerThreads anpassen lässt, wenn die Standardkonfiguration bei Lastspitzen nicht mehr mithält.

Ein weiterer wichtiger Hebel ist Rate-Limiting direkt am Input, um fehlerhafte Anwendungen zu bremsen, die in einer Schleife tausende identische Fehlermeldungen pro Sekunde erzeugen. Ohne Begrenzung kann eine einzelne fehlerhafte Anwendung sonst die gesamte zentrale Logging Infrastruktur überlasten und damit auch die Sichtbarkeit auf andere, tatsächlich relevante Fehler verschlechtern.


# Worker Threads erhöhen und Rate Limiting pro Absender aktivieren
main_queue(queue.workerThreads="4" queue.dequeueBatchSize="1000")

input(type="imtcp" port="514"
  ratelimit.interval="10"
  ratelimit.burst="2000")

9. Best Practices und Troubleshooting im Alltag

Vor jeder Änderung an der Konfiguration lohnt sich ein Testlauf mit rsyslogd -N1, der Syntaxfehler ohne einen echten Neustart des Daemons aufdeckt. Für den Verbindungstest zwischen Client und zentralem Server eignet sich logger, das eine einzelne Testnachricht über den lokalen Syslog Socket sendet und sich auf dem zentralen Server sofort in der erwarteten Zieldatei nachverfolgen lässt.

Firewall Regeln sind eine häufige Fehlerquelle: Der Port des zentralen Servers muss explizit für die Applikationsserver freigegeben sein, üblicherweise 514 für unverschlüsselte Verbindungen und ein separater Port wie 6514 für TLS, damit beide Betriebsarten sauber getrennt bleiben und ein versehentlich unverschlüsselter Client nicht unbemerkt Klartext über das Netz sendet.

Dokumentation zahlt sich hier besonders aus: Ein kurzer Überblick, welcher Server welche Facility und welchen Tag verwendet, erspart neuen Teammitgliedern das mühsame Rückwärtsermitteln der Konfiguration aus den bereits gesammelten Logs.

Transportart Zuverlässigkeit Verschlüsselung Typischer Einsatz
UDP (imudp) Keine Zustellgarantie, Pakete können verloren gehen Keine Unkritisches Debug Logging, lokales Netz
TCP (imtcp) Zuverlässig, verbindungsorientiert Keine, es sei denn TLS aktiv Produktives zentrales Logging
TCP mit TLS Zuverlässig, verbindungsorientiert Vollständig, inklusive Zertifikatsprüfung Produktion mit sensiblen Log Inhalten
RELP Zuverlässig mit Bestätigung pro Nachricht Über TLS kombinierbar Compliance Anforderungen, garantierte Zustellung

Mironsoft

Server-Administration, Docker-Hosts und Performance-Tuning

Linux-Server, die niemand im Team richtig versteht?

Wir übernehmen Setup, Absicherung und Performance-Tuning von Linux-Servern und Docker-Hosts für Magento-Deployments, dokumentiert und nachvollziehbar statt gewachsen und unklar.

Server-Audit

Bestehende Server-Konfiguration auf Sicherheitslücken und Performance-Bremsen prüfen.

Docker-Host-Setup

Produktionsreife Docker-Umgebungen für Magento sauber aufsetzen und absichern.

Monitoring & Tuning

Ressourcenverbrauch messen und Systemd, Kernel und Dienste gezielt optimieren.

10. Zusammenfassung

Zentrales rsyslog Logging

Kernmodul

imtcp für Empfang, omfwd für Weiterleitung

Verschlüsselung

TLS über GnuTLS oder OpenSSL Stream Treiber

Ausfallsicherheit

Disk unterstützte Warteschlangen gegen Nachrichtenverlust

Alternative

journald Forwarding für rein systemd zentrierte Umgebungen

11. FAQ: Zentrales rsyslog Logging

1Warum sollte ich TCP statt UDP für zentrales Logging verwenden?
UDP garantiert keine Zustellung, einzelne Pakete gehen bei Netzwerklast oder vollen Puffern stillschweigend verloren. TCP ist verbindungsorientiert und meldet Übertragungsfehler zurück, weshalb es für produktives zentrales Logging fast immer die bessere Wahl ist.
2Wie verhindere ich Nachrichtenverlust bei einer Netzwerkunterbrechung?
Eine disk unterstützte Warteschlange mit queue.type LinkedList und einer definierten maxdiskspace Grenze speichert Nachrichten temporär lokal, wenn der zentrale Server nicht erreichbar ist, und sendet sie automatisch nach, sobald die Verbindung wiederhergestellt ist.
3Muss ich für TLS eine eigene Zertifizierungsstelle betreiben?
Für eine kleine bis mittlere Serverflotte ist eine eigene, einfache CA praktikabel und muss nicht öffentlich vertrauenswürdig sein, da nur die eigenen Server das Zertifikat validieren. Alternativ lassen sich auch Zertifikate einer internen PKI oder eines Tools wie step ca verwenden.
4Was ist der Unterschied zwischen imfile und imuxsock?
imuxsock nimmt Nachrichten entgegen, die Anwendungen bereits aktiv über den lokalen Syslog Socket senden. imfile überwacht dagegen bestehende Textdateien wie Nginx Access Logs, die selbst keine native Syslog Unterstützung haben, und liest neue Zeilen wie ein tail Prozess ein.
5Wie teste ich, ob die Weiterleitung an den zentralen Server funktioniert?
Der Befehl logger sendet eine einzelne Testnachricht über den lokalen Syslog Socket. Diese sollte innerhalb weniger Sekunden in der erwarteten Zieldatei auf dem zentralen Server erscheinen, andernfalls liegt das Problem meist an Firewall Regeln oder einer fehlerhaften Weiterleitungsregel.
6Wann lohnt sich RELP statt reinem TCP?
RELP bestätigt jede einzelne Nachricht auf Anwendungsebene, während TCP nur die zuverlässige Übertragung auf Transportebene garantiert. Für Compliance Szenarien mit garantierter Zustellung, etwa bei Audit Logs, ist RELP deshalb die robustere Wahl.
7Kann ich rsyslog und journald parallel im gleichen System nutzen?
Ja, das ist sogar der Standardfall auf vielen Distributionen: journald sammelt lokal, und rsyslog liest über imjournal aus dem Journal und übernimmt die Weiterleitung an externe Systeme sowie die klassische Dateiablage.
8Wie skaliert rsyslog bei sehr hohem Nachrichtenaufkommen?
Über mehrere Worker Threads pro Warteschlange, konfigurierbar mit queue.workerThreads, und über Batch Verarbeitung mit queue.dequeueBatchSize. Zusätzlich hilft Rate Limiting am Input, um einzelne fehlerhafte Quellen von der übrigen Verarbeitung zu isolieren.
9Warum sollte Nginx im JSON Format statt im Standardformat loggen?
Ein strukturiertes JSON Format erlaubt es, Felder wie Statuscode oder Antwortzeit direkt maschinell auszuwerten, ohne sie mit fehleranfälligen regulären Ausdrücken aus einer Textzeile extrahieren zu müssen. Das vereinfacht spätere Auswertungen und Alerts erheblich.
10Was passiert, wenn der zentrale rsyslog Server ausfällt?
Clients mit einer disk unterstützten Warteschlange puffern Nachrichten lokal, bis der Server wieder erreichbar ist, und senden sie dann nach. Ohne diese Konfiguration gehen Nachrichten, die während des Ausfalls entstehen, unwiederbringlich verloren.