aslain.dev
0%
01 Hizmetler 02 Hakkımda 03 Projeler 04 Stack 05 Blog 06 İletişim
← Tüm makaleler Gameserver

Server logbeheer: groottecontrole met logrotate

Als je een gameserver draait, wordt server logbeheer vroeg of laat een hoofdpijndossier. Verbindingen, chatlogboeken, GM-commando's, foutmeldingen en de duizenden regels die je game-engine produceert, stapelen zich dag na dag op. Eén enkel syserr.txt dat uitgroeit tot gigabytes en de schijf volstouwt tot de server crasht omdat er nergens meer plek is om te schrijven, is een klassiek scenario. In dit artikel leg ik uit hoe je met Linux' standaardtool logrotate je logbestanden automatisch laat roteren, comprimeert en onder controle houdt.

Waarom lopen logbestanden uit de hand?

Het maakt niet uit of je Metin2, Minecraft, FiveM of je eigen C++-server draait; ze produceren allemaal logbestanden waarnaar voortdurend wordt geschreven. Het probleem komt van één bestand dat eindeloos groeit:

  • Tijdens piekuren kunnen er honderden regels per seconde worden geschreven; syslog, chat.log of syserr zwellen razendsnel op.
  • Een fout zoeken in één gigantisch bestand wordt onmogelijk; zelfs grep duurt minuten.
  • Als de schijf vol is, kunnen niet alleen de logs maar ook de database en de gameprocessen niet meer schrijven; de server stopt volledig.
  • Deze enorme logbestanden telkens mee back-uppen verspilt voor niets ruimte en tijd.

De oplossing is de logs met vaste tussenpozen te "roteren": het actieve bestand archiveren, een nieuw bestand starten, de oude comprimeren en alles boven een vastgesteld aantal verwijderen. Dat is precies wat logrotate doet.

Hoe werkt logrotate?

logrotate is op vrijwel elke Linux-distributie geïnstalleerd. Het is geen eigen service (daemon); het wordt eens per dag gestart door cron of een systemd-timer. Op de meeste systemen doet het script /etc/cron.daily/logrotate dit werk. Bij het draaien leest het de configuratiebestanden, beslist welke logs geroteerd moeten worden en bewaart zijn status in /var/lib/logrotate/status, zodat het onthoudt "wanneer heb ik dit log voor het laatst geroteerd?"

De configuratie staat op twee plekken:

  • /etc/logrotate.conf — algemene instellingen.
  • /etc/logrotate.d/ — een apart bestand per applicatie. Hier plaats je je eigen regel voor de gameserver.

Een voorbeeldconfiguratie voor een gameserver

Stel dat je serverlogs onder /var/log/metin2/ staan met de extensie .log. Maak een bestand met de naam /etc/logrotate.d/metin2:

/var/log/metin2/*.log {
    daily
    rotate 14
    size 100M
    missingok
    notifempty
    compress
    delaycompress
    copytruncate
}

Wat de richtlijnen betekenen:

  • daily — eens per dag roteren. weekly of monthly kan ook.
  • size 100M — roteren zodra het bestand 100 MB overschrijdt, zonder op de periode te wachten. Cruciaal op drukke servers.
  • rotate 14 — maximaal 14 oude kopieën bewaren; de 15e wordt verwijderd.
  • compress — oude logs comprimeren met gzip; dit bespaart meestal zo'n 90% ruimte.
  • delaycompress — het meest recent geroteerde bestand pas een cyclus later comprimeren; voorkomt gegevensverlies als een proces er nog naar schrijft.
  • missingok — geen fout geven als het bestand ontbreekt.
  • notifempty — een leeg bestand niet roteren.
  • copytruncate — het bestand kopiëren en het origineel leegmaken, zodat de engine zonder herstart kan blijven loggen.

copytruncate of create?

Dit is de meest gemaakte fout. Standaard werkt logrotate met create-logica: het hernoemt het actieve bestand en maakt een leeg bestand met dezelfde naam. Maar gameservers houden het logbestand open en blijven naar dezelfde file descriptor schrijven; ook al verandert de naam, de schrijfacties gaan nog steeds naar het oude bestand (nu .1). Het gevolg: het nieuwe bestand blijft leeg en het oude blijft groeien.

Er zijn twee oplossingen:

  • copytruncate: logrotate maakt een kopie van het bestand en maakt het origineel daarna leeg (nul bytes). De server, die niets merkt, blijft naar dezelfde descriptor schrijven. Een paar regels die in het korte moment tussen kopiëren en leegmaken worden geschreven, kunnen verloren gaan, maar een herstart is niet nodig. Voor de meeste kant-en-klare gameservers is dit de meest praktische weg.
  • postrotate met een signaal: als je server zijn logbestand op een signaal opnieuw kan openen, stel je het na de rotatie op de hoogte. Dit elimineert het risico van copytruncate om zelfs maar één regel te verliezen:
/var/log/metin2/*.log {
    daily
    rotate 14
    compress
    delaycompress
    missingok
    notifempty
    sharedscripts
    postrotate
        systemctl reload metin2.service > /dev/null 2>&1 || true
    endscript
}

sharedscripts voert het postrotate-blok maar één keer uit, ook als meerdere bestanden bij het patroon passen.

Eerst testen, dan vertrouwen

Wacht na het schrijven van de configuratie niet blindelings af. Probeer logrotate in dry-run-modus; die laat zien wat het zou doen zonder iets te wijzigen:

logrotate -d /etc/logrotate.d/metin2

De uitvoer toont welke bestanden geroteerd zouden worden en handelingen zoals copytruncate. Om echt een rotatie te forceren, gebruik je -f:

logrotate -f /etc/logrotate.d/metin2

Twee veelvoorkomende valkuilen: logrotate slaat een configuratiebestand om veiligheidsredenen over als het door andere gebruikers schrijfbaar is (world-writable) of niet van root is. Houd de bestandsrechten op chmod 0644 en het eigendom op root:root. Mogelijk heb je ook de richtlijn su gebruiker groep nodig om de eigenaar van de logmap op te geven.

Veelgestelde vragen

Kan ik logrotate vaker draaien, bijvoorbeeld elk uur?

Ja. Je kunt hourly aan de configuratie toevoegen, maar omdat logrotate door een dagelijkse cron wordt gestart, vereist een uurlijkse uitvoering een aparte cron-regel of systemd-timer. In de meeste gevallen is de size-richtlijn praktischer: het bestand wordt bij de dagelijkse uitvoering geroteerd zodra het je gekozen grootte overschrijdt.

Kan ik in gecomprimeerde oude logs zoeken?

Ja. Het commando zgrep "error" syserr.log.3.gz zoekt in .gz-bestanden zonder ze uit te pakken. zcat en zless werken ook.

Moet ik mijn huidige enorme logbestand eerst verkleinen?

Nee; logrotate roteert het bij de eerste uitvoering. Toch kun je, als de schijf op een kritiek niveau zit, met -f een rotatie forceren om meteen ruimte vrij te maken. Verwijder het bestand nooit met rm terwijl het proces draait; de ruimte komt niet terug, omdat het proces het bestand nog open houdt.

Wil je je logs onder controle en je server vrij van crashes? We kunnen samen de log-infrastructuur van je gameserver en het algemene Linux-onderhoud op orde brengen. Neem contact op en laten we een rotatieplan opstellen dat bij jouw server past.

Bu kategorideki tüm yazılar →

Devamı için