Wenn du einen Spieleserver betreibst, wird das Server-Log-Management früher oder später zum Problem. Verbindungen, Chat-Protokolle, GM-Befehle, Fehlermeldungen und die Tausenden von Zeilen, die deine Game-Engine erzeugt, häufen sich Tag für Tag an. Eine einzelne syserr.txt, die auf Gigabyte anwächst und die Festplatte vollstopft, bis der Server abstürzt, weil kein Platz mehr zum Schreiben da ist, ist ein klassisches Szenario. In diesem Artikel erkläre ich, wie du mit dem Standardwerkzeug von Linux, logrotate, deine Logdateien automatisch rotierst, komprimierst und unter Kontrolle hältst.
Warum geraten Logdateien außer Kontrolle?
Es spielt keine Rolle, ob du Metin2, Minecraft, FiveM oder deinen eigenen C++-Server betreibst; sie alle erzeugen Logdateien, in die ständig geschrieben wird. Das Problem entsteht durch eine einzige Datei, die endlos wächst:
- Zu Stoßzeiten können Hunderte Zeilen pro Sekunde geschrieben werden;
syslog,chat.logodersyserrblähen sich rasant auf. - Einen Fehler in einer riesigen Datei zu suchen, wird unmöglich; selbst
grepdauert Minuten. - Ist die Festplatte voll, können nicht nur die Logs, sondern auch die Datenbank und die Spielprozesse nicht mehr schreiben; der Server bleibt komplett stehen.
- Diese riesigen Logdateien bei jedem Backup mitzukopieren, verschwendet ohne Nutzen Platz und Zeit.
Die Lösung besteht darin, die Logs in festen Abständen zu „rotieren": die aktive Datei zu archivieren, eine neue zu beginnen, die alten zu komprimieren und alles über einer festgelegten Anzahl zu löschen. Genau das macht logrotate.
Wie funktioniert logrotate?
logrotate ist auf nahezu jeder Linux-Distribution installiert. Es ist kein eigener Dienst (Daemon); es wird einmal täglich von cron oder einem systemd-Timer ausgelöst. Auf den meisten Systemen erledigt das Skript /etc/cron.daily/logrotate diese Aufgabe. Bei der Ausführung liest es die Konfigurationsdateien, entscheidet, welche Logs rotiert werden müssen, und speichert seinen Status in /var/lib/logrotate/status, damit es sich merkt: „Wann habe ich dieses Log zuletzt rotiert?"
Die Konfiguration liegt an zwei Stellen:
/etc/logrotate.conf— globale Einstellungen./etc/logrotate.d/— eine eigene Datei pro Anwendung. Hier legst du deine Regel für den Spieleserver ab.
Eine Beispielkonfiguration für einen Spieleserver
Angenommen, deine Serverlogs liegen unter /var/log/metin2/ mit der Endung .log. Erstelle eine Datei namens /etc/logrotate.d/metin2:
/var/log/metin2/*.log {
daily
rotate 14
size 100M
missingok
notifempty
compress
delaycompress
copytruncate
}
Was die Direktiven bedeuten:
daily— einmal täglich rotieren.weeklyodermonthlyfunktionieren ebenfalls.size 100M— rotieren, sobald die Datei 100 MB überschreitet, ohne auf die Periode zu warten. Auf ausgelasteten Servern entscheidend.rotate 14— höchstens 14 alte Kopien behalten; die 15. wird gelöscht.compress— alte Logs mitgzipkomprimieren; das spart meist rund 90 % Platz.delaycompress— die zuletzt rotierte Datei erst einen Zyklus später komprimieren; verhindert Datenverlust, wenn ein Prozess noch hineinschreibt.missingok— keinen Fehler ausgeben, wenn die Datei fehlt.notifempty— eine leere Datei nicht rotieren.copytruncate— die Datei kopieren und das Original leeren, damit die Engine ohne Neustart weiter loggen kann.
copytruncate oder create?
Das ist der häufigste Fehler. Standardmäßig arbeitet logrotate mit der create-Logik: Es benennt die aktive Datei um und legt eine leere Datei mit demselben Namen an. Aber Spieleserver halten die Logdatei geöffnet und schreiben weiter in denselben File Descriptor; auch wenn sich der Name ändert, gehen die Schreibvorgänge weiterhin in die alte Datei (jetzt .1). Das Ergebnis: Die neue Datei bleibt leer und die alte wächst weiter.
Es gibt zwei Lösungen:
- copytruncate: logrotate erstellt eine Kopie der Datei und kürzt das Original anschließend auf null Bytes. Der Server schreibt, ohne etwas zu merken, weiter in denselben Descriptor. Ein paar Zeilen, die im kurzen Moment zwischen Kopieren und Kürzen geschrieben werden, können verloren gehen, aber ein Neustart ist nicht nötig. Für die meisten fertigen Spieleserver ist das der praktischste Weg.
- postrotate mit einem Signal: Wenn dein Server seine Logdatei per Signal neu öffnen kann, benachrichtigst du ihn nach der Rotation. Das beseitigt das Risiko von copytruncate, auch nur eine Zeile zu verlieren:
/var/log/metin2/*.log {
daily
rotate 14
compress
delaycompress
missingok
notifempty
sharedscripts
postrotate
systemctl reload metin2.service > /dev/null 2>&1 || true
endscript
}
sharedscripts führt den postrotate-Block nur einmal aus, selbst wenn mehrere Dateien auf das Muster passen.
Erst testen, dann vertrauen
Warte nach dem Schreiben der Konfiguration nicht blind ab. Probiere logrotate im Dry-Run-Modus; er zeigt, was er tun würde, ohne etwas zu verändern:
logrotate -d /etc/logrotate.d/metin2
Die Ausgabe zeigt, welche Dateien rotiert würden, und Vorgänge wie copytruncate. Um eine Rotation tatsächlich zu erzwingen, verwende -f:
logrotate -f /etc/logrotate.d/metin2
Zwei häufige Stolperfallen: logrotate überspringt eine Konfigurationsdatei aus Sicherheitsgründen, wenn sie von anderen Benutzern beschreibbar ist (world-writable) oder nicht root gehört. Halte die Dateirechte auf chmod 0644 und den Besitz auf root:root. Möglicherweise brauchst du außerdem die Direktive su Benutzer Gruppe, um den Eigentümer des Log-Verzeichnisses anzugeben.
Häufige Fragen
Kann ich logrotate öfter ausführen, etwa stündlich?
Ja. Du kannst der Konfiguration hourly hinzufügen, aber da logrotate von einem täglichen Cron ausgelöst wird, erfordert eine stündliche Ausführung einen separaten Cron-Eintrag oder systemd-Timer. In den meisten Fällen ist die size-Direktive praktischer: Die Datei wird beim täglichen Lauf rotiert, sobald sie deine gewählte Größe überschreitet.
Kann ich in komprimierten alten Logs suchen?
Ja. Der Befehl zgrep "error" syserr.log.3.gz sucht in .gz-Dateien, ohne sie zu entpacken. zcat und zless funktionieren ebenfalls.
Muss ich meine aktuelle riesige Logdatei zuerst verkleinern?
Nein; logrotate rotiert sie beim ersten Lauf. Wenn die Festplatte jedoch auf einem kritischen Stand ist, kannst du mit -f eine Rotation erzwingen, um sofort Platz freizugeben. Lösche die Datei niemals mit rm, während der Prozess läuft; der Platz kommt nicht zurück, weil der Prozess die Datei noch geöffnet hält.
Du willst deine Logs unter Kontrolle und deinen Server frei von Abstürzen? Wir können die Log-Infrastruktur deines Spieleservers und die allgemeine Linux-Wartung gemeinsam in Ordnung bringen. Kontaktiere mich, und lass uns einen Rotationsplan aufsetzen, der zu deinem Server passt.