Direct naar de inhoud

Cookie-instellingen

Kies per soort welke cookies je toestaat. Je kunt je keuze altijd wijzigen via Cookie-instellingen onderaan elke pagina. Privacyverklaring

Noodzakelijk

Altijd aan

Nodig om in te loggen, je winkelwagen te bewaren en je keuzes te onthouden. Deze staan altijd aan.

Welke cookies?
  • weboke_sessie, weboke_klant, weboke_remember: je sessie en ingelogd blijven
  • weboke_basket: je winkelwagen
  • wkBtwIncl: prijzen met of zonder btw tonen
  • wok_cookies: je cookiekeuze, 12 maanden

Meet welke advertentie tot een bezoek of bestelling leidt, zodat we niet betalen voor advertenties die niets doen.

Welke cookies?
  • Google Ads via Google Tag Manager (_gcl_au, _gcl_aw), tot 90 dagen
  • OpenAI Ads, advertenties in ChatGPT
  • wok_aff: via welke partner je bij ons kwam (affiliateprogramma), 60 dagen

4,6

Land en taal

Elk land heeft zijn eigen site, met prijzen en btw van dat land.

Bekijken

Module 6 · 6.2

Logs lezen met journalctl

Module 6: Diensten en logs · Leestijd: 11 minuten

Leerdoel: Na deze les kun je met journalctl gericht zoeken in de logboeken van je server (per dienst, prioriteit en tijd), weet je waar andere logbestanden staan, en voorkom je dat logs je schijf vullen.

Kernbegrippen: journald, journal, journalctl -u, -p, --since/--until, -f, -b, -e, -n, prioriteit (err, warning, info), persistente opslag, /var/log/journal, --disk-usage, --vacuum-size, /var/log, logrotate, rsyslog

Het logboek als eerste getuige

Als iets op je server niet werkt, staat de reden bijna altijd in een logboek. Een website die een foutpagina geeft, een dienst die niet start, een back-up die vannacht niet liep: de server heeft het opgeschreven. Een goede beheerder kijkt eerst in het logboek, en gaat pas daarna dingen veranderen.

Op moderne Linux-servers verzamelt journald (onderdeel van systemd) de meldingen van de kernel, van systemd zelf en van alle diensten in één logboek: de journal. Je leest het met journalctl.

Om alles te kunnen lezen moet je in de groep adm of systemd-journal zitten, of sudo gebruiken. Zonder die rechten zie je alleen je eigen meldingen.

Waar staat het? Persistent of vluchtig

journald bewaart de journal op een van twee plekken:

  • in /var/log/journal/: persistent, de logs blijven na een herstart bewaard;
  • in /run/log/journal/: vluchtig, in het geheugen, weg na een herstart.

De standaardinstelling (Storage=auto in /etc/systemd/journald.conf) kiest persistent als de map /var/log/journal/ bestaat. Op Debian maakt het systemd-pakket die map al sinds Debian 11 aan, en op Ubuntu bestaat hij ook. Controleer het:

anna@web1:~$ ls -d /var/log/journal
/var/log/journal
anna@web1:~$ journalctl --list-boots | tail -n 3
 -2 3c1f... Sun 2026-11-01 04:30:12 CET Sun 2026-11-08 04:30:01 CET
 -1 9ab7... Sun 2026-11-08 04:30:40 CET Mon 2026-11-09 08:12:05 CET
  0 e41d... Mon 2026-11-09 08:12:30 CET Mon 2026-11-09 11:40:17 CET

Zie je maar één opstartmoment terwijl de server al eens herstart is, dan zijn je logs vluchtig. Maak de map aan (sudo mkdir -p /var/log/journal en sudo systemd-tmpfiles --create --prefix /var/log/journal) en herstart journald. Dat is belangrijk: na een crash wil je juist weten wat er vóór de herstart gebeurde.

Sinds Debian 12 installeert Debian rsyslog niet meer standaard. Dat programma schreef vroeger tekstbestanden als /var/log/syslog en /var/log/auth.log. Op een nieuwe Debian-server bestaan die dus niet; alles staat in de journal. Ubuntu heeft rsyslog nog wel. Handleidingen die zeggen "kijk in /var/log/auth.log" kun je op Debian vertalen naar journalctl -u ssh.

Zoeken: de filters die je echt gebruikt

Zonder filter laat journalctl alles zien, vanaf het oudste. Dat is zelden wat je wilt. De belangrijkste filters, die je kunt combineren:

FilterVoorbeeldWat
-u <unit>journalctl -u nginxalleen die dienst
-p <prioriteit>journalctl -p erralleen fouten en erger
--since, --until--since "2026-11-09 03:00" --until "04:00"tijdvak; ook today, yesterday, "1 hour ago"
-bjournalctl -b, journalctl -b -1sinds deze opstart, of de vorige
-fjournalctl -u nginx -flive meekijken (zoals tail -f), stoppen met Ctrl+C
-ejournalctl -u ssh -espring naar het einde
-njournalctl -u ssh -n 50de laatste 50 regels
-kjournalctl -kalleen meldingen van de kernel
--no-pagerzonder bladeren, handig met grep

De prioriteiten lopen van 0 (emerg) tot 7 (debug): emerg, alert, crit, err, warning, notice, info, debug. Met -p err krijg je err en alles wat ernstiger is. -p warning laat ook waarschuwingen zien.

Een typisch zoekpad. Je website geeft sinds vanochtend een fout 502:

anna@web1:~$ systemctl status php8.4-fpm
× php8.4-fpm.service - The PHP 8.4 FastCGI Process Manager
     Active: failed (Result: exit-code) since Mon 2026-11-09 07:02:11 CET; 4h ago
...
anna@web1:~$ sudo journalctl -u php8.4-fpm --since today -p warning --no-pager
nov 09 07:02:10 web1 php-fpm8.4[1830]: [09-Nov-2026 07:02:10] ERROR: [/etc/php/8.4/fpm/pool.d/www.conf:42] unknown entry 'pm.max_children '
nov 09 07:02:10 web1 php-fpm8.4[1830]: [09-Nov-2026 07:02:10] ERROR: FPM initialization failed
nov 09 07:02:11 web1 systemd[1]: php8.4-fpm.service: Main process exited, code=exited, status=78/CONFIG
nov 09 07:02:11 web1 systemd[1]: php8.4-fpm.service: Failed with result 'exit-code'.

De oorzaak staat er letterlijk: een tikfout op regel 42 van een configuratiebestand. De status 78 (CONFIG) bevestigt dat het om een configuratiefout gaat. Je hoeft niets te raden.

Twee tips bij het lezen:

  • Lees van boven naar beneden, en zoek de eerste fout. Een fout veroorzaakt vaak een hele reeks vervolgmeldingen. De eerste is meestal de oorzaak.
  • Let op de tijd. Wat veranderde er rond dat moment? Een automatische update (les 4.2: /var/log/unattended-upgrades/), een wijziging van jou, een herstart?

Andere logbestanden

Niet alles staat in de journal. Veel programma's schrijven ook (of alleen) eigen bestanden in /var/log/:

Bestand of mapWat
/var/log/nginx/access.log en error.logelke aanvraag en elke fout van nginx
/var/log/apt/history.logwat apt wanneer installeerde
/var/log/unattended-upgrades/automatische updates (les 4.2)
/var/log/fail2ban.logblokkades (les 5.3)
/var/log/mysql/ of de journalMariaDB/MySQL, afhankelijk van de instelling

Grote tekstbestanden lees je met less (zoeken met /), het einde met tail -n 50, live met tail -f, en filteren met grep:

anna@web1:~$ sudo grep " 502 " /var/log/nginx/access.log | tail -n 5

De logs van Docker-containers staan niet in /var/log maar bij Docker zelf: docker compose logs (les 9.3).

Logs mogen je schijf niet vullen

Een volle schijf is een van de meest voorkomende oorzaken van een server die "ineens" niet meer werkt: databases stoppen, updates mislukken, je kunt soms zelfs niet meer inloggen. Logs zijn vaak de schuldige.

De journal begrenst zichzelf. Standaard gebruikt hij hoogstens 10% van het bestandssysteem, met een maximum van 4 GB (SystemMaxUse=). Hoeveel hij nu gebruikt en hoe je opruimt:

anna@web1:~$ journalctl --disk-usage
Archived and active journals take up 512.0M in the file system.
anna@web1:~$ sudo journalctl --vacuum-time=30d     # ouder dan 30 dagen weg
anna@web1:~$ sudo journalctl --vacuum-size=500M    # tot 500 MB

Wil je een vaste grens, zet dan in een drop-in /etc/systemd/journald.conf.d/grootte.conf:

[Journal]
SystemMaxUse=1G

en herstart journald met sudo systemctl restart systemd-journald.

Tekstbestanden in /var/log worden bijgehouden door logrotate: elke dag of week wordt een bestand hernoemd (error.log.1), oudere versies worden ingepakt (.gz) en de oudste weggegooid. De regels per programma staan in /etc/logrotate.d/. Pakketten uit de distributie brengen hun eigen regel mee. Schrijft een eigen programma of script naar een eigen logbestand, maak dan zelf een regel, anders groeit het bestand eindeloos.

Zoeken wat ruimte inneemt:

anna@web1:~$ df -h /
anna@web1:~$ sudo du -xh /var/log | sort -h | tail -n 5

Logs en privacy

Logboeken bevatten IP-adressen, gebruikersnamen en soms mailadressen: dat zijn persoonsgegevens. Bewaar ze niet langer dan nodig (een paar weken tot een paar maanden is gangbaar voor een kleine server), laat ze niet openbaar staan (een map /logs in je webroot is een bekende fout) en kopieer ze niet zomaar naar diensten van anderen.

Op AlmaLinux en Rocky Linux

journalctl werkt hetzelfde. Daar staat rsyslog nog wel standaard aan, met bestanden als /var/log/messages en /var/log/secure (de tegenhanger van auth.log). Meldingen van SELinux staan in /var/log/audit/audit.log; ausearch -m avc -ts recent toont recente weigeringen.

Samenvatting

  • journald verzamelt alle meldingen in de journal; lees die met journalctl, gefilterd op dienst (-u), prioriteit (-p), tijd (--since) en opstart (-b).
  • Controleer dat de journal persistent is (/var/log/journal bestaat), anders ben je je logs kwijt na een herstart.
  • Debian 12 en later hebben standaard geen rsyslog en dus geen /var/log/auth.log en /var/log/syslog; alles staat in de journal.
  • Zoek de eerste fout en kijk naar wat er rond dat moment veranderde.
  • Houd de omvang in de gaten: de journal begrenst zichzelf (--disk-usage, --vacuum-*), tekstbestanden regelt logrotate.

Quiz

1. Welk commando toont alleen de fouten van nginx van vandaag?



2. Je server is vannacht herstart na een crash. journalctl -b -1 geeft "Specifying boot ID or boot offset has no effect, no persistent journal was found". Wat betekent dat?



3. Een handleiding zegt dat je mislukte SSH-logins in /var/log/auth.log vindt, maar op je nieuwe Debian 13-server bestaat dat bestand niet. Waar kijk je?



4. In een logboek staan twintig foutmeldingen achter elkaar. Waar begin je?



5. Je schijf zit vol en journalctl --disk-usage zegt 400 MB. Wat is de beste vervolgstap?



Opdracht

Opdracht Z6.2: Een crashende dienst ontleden. In het voorbeeldbestand journal-crash-1.txt staat de uitvoer van systemctl status en journalctl van een dienst die steeds opnieuw start en dan opgeeft. Beantwoord: hoe heet de dienst, hoe vaak probeerde systemd hem te starten, met welke afsluitcode stopte hij, wat is de oorzaak volgens de eerste foutmelding, en hoe laat gaf systemd het op? Het programma vergelijkt met de vaste sleutel. Kijk daarna op je eigen server of journalctl -p err -b fouten toont, en of je journal persistent is.

Opdracht Z6.2: Een crashende dienst ontleden

Bestand bij deze opdracht: journal-crash-1.txt







Wat je invult en wat we vinden, slaan we niet op. Je browser onthoudt je antwoorden en of je de opdracht hebt gehaald. Ben je aangemeld, dan bewaren we alleen dat je de opdracht (bijna) goed had in Mijn cursussen; daar kun je het ook verwijderen.

Verder lezen

Even geduld…

Stel je domeinen in

Regel per domein de nameservers, de koppeling aan je hosting en wie de eigenaar wordt.

Je domeinen laden…