Bijna alle Linux distributies gebruiken vandaag Systemd om een systeem te starten. Eén van de kritiekpunten op Systemd is dat het veel meer is dan een eenvoudig opstartsysteem. Het probeert namelijk verschillende Linux subsystemen heruit te vinden.
Het traditionele Linux logsysteem was rsyslog, een moderne versie van syslog. Systemd introduceerde z'n eigen logsysteem: de journald daemon (dienst) slaat loggegevens binair op, die je opvraagt met de journalctl opdracht.
Het gedrag van de journald daemon kan je aanpassen in het configuratiebestand /etc/systemd/journald.conf. Rechtstreeks aanpassen in dit bestand wordt afgeraden. Je plaatst aangepaste parameters beter in aparte configuratiebestanden (.conf) in de map /etc/systemd/journald.conf.d/.
De bestanden binnen de map /etc/systemd/journald.conf.d/ hebben voorrang op /etc/systemd/journald.conf. Ze staan gesorteerd in lexicografische (logische) volgorde en worden in die volgorde uitgevoerd, na het hoofd configuratiebestand. Indien een bepaalde optie in verschillende bestanden voorkomt, wordt enkel de laatste effectief gebruikt.
Het /etc/systemd/journald.conf bestand bevat standaard een lijst uitgeschakelde (in commentaar geplaatste) standaard opties (voorbeeld van openSUSE).
[Journal] #Storage=auto #Compress=yes #Seal=yes #SplitMode=uid #SyncIntervalSec=5m #RateLimitIntervalSec=30s #RateLimitBurst=10000 #SystemMaxUse= #SystemKeepFree= #SystemMaxFileSize= #SystemMaxFiles=100 #RuntimeMaxUse= #RuntimeKeepFree= #RuntimeMaxFileSize= #RuntimeMaxFiles=100 #MaxRetentionSec= #MaxFileSec=1month #ForwardToSyslog=no #ForwardToKMsg=no #ForwardToConsole=no #ForwardToWall=yes #TTYPath=/dev/console #MaxLevelStore=debug #MaxLevelSyslog=debug #MaxLevelKMsg=notice #MaxLevelConsole=info #MaxLevelWall=emerg #LineMax=48K #ReadKMsg=yes #Audit=yes
De Storage
optie bepaalt waar de journal gegevens worden bewaard.
De standaard waarde is auto
, mogelijke waarden zij:
Bij volatile
worden de journal gegevens in het geheugen bewaard in de map /run/log/journal/ (/run/ is een tmpfs
), waardoor het geen systeem herstart overleeft.
Bij persistent
daarentegen worden de journal gegevens op de schijf bewaard in de map /var/log/journal/, die indien nodig wordt aangemaakt.
Als de schijf geen schrijfrechten heeft, wordt toch /run/log/journal/ gebruikt.
De standaard auto
waarde werkt zoals persistent
en worden de journal gegevens bewaard in de map /var/log/journal/.
Maar indien deze map niet bestaat, worden de logs in het geheugen bewaard.
Bij het gebruik van de waarde none
worden er geen journal gegevens bewaard.
Het doorsturen naar ander logsystemen werkt wel nog.
De Compress
optie bepaalt of gegevens met een grootte van meer dan 512 bytes gecomprimeerd worden bewaard.
Als deze optie de boolean yes
bevat is de compressie actief.
Bevat deze optie een getal, dan is dit de grootte waarbij de compressie actief wordt.
Deze wordt standaard in bytes uitgedrukt maar mag ook uitgebreid worden met K, M of G.
Voor Systemd werden de logs beheerd door een syslog systeem (rsyslog). Journald kan zijn gegevens doorsluizen naar verschillende doelen, zoals tekstbestanden, terminals en zelfs naar andere netwerkapparaten.
Journald en syslog kunnen naast elkaar werken. Dit is soms nodig omdat journald sommige mogelijkheden mist, zoals gecentraliseerd loggen. Of juist omdat we de logs in tekstbestanden willen opslaan om deze met standaard Linux opdrachten te manipuleren.
De ForwardToSyslog
heeft een boolean waarde.
De waarde yes
zorgt dat de berichten in de socket /run/systemd/journal/syslog terecht komen, waar syslog ze kan lezen.
Deze optie kan je ook activeren bij het starten (boot) met de optie systemd.journald.forward_to_syslog
.
Gelijkaardige opties kunnen gebruikt worden om gegevens door te sturen naar kmsg (kernel log buffer), naar een console of wall (als log berichten naar aangemelde gebruikers). Enkel de laatste optie is standaard ingeschakeld.
Om systeem logs te onderzoeken en het systemd journal te raadplegen gebruiken we journalctl
.
Zonder parameters toont deze opdracht de volledige journal.
Gelukkig kunnen we filteren.
Eén van de meest waardevolle opties van journalctl
is -u
(--unit
).
Deze optie toont enkel de berichten van een bepaalde systemd-eenheid.
Om bijvoorbeeld de berichten afkomstig van de NetworkManager.service eenheid weer te geven, gebruiken we:
dany@pindabook:~>sudo journalctl -u NetworkManager
[sudo] wachtwoord voor root: -- Logs begin at Sun 2022-02-13 17:52:56 CET, end at Sun 2022-02-13 18:45:05 CET. -- feb 13 17:53:03 pindabook systemd[1]: Starting Network Manager... feb 13 17:53:03 pindabook NetworkManager[1313]:[1644771183.6311] NetworkManager (version 1.22.10) is starting... (for the f> feb 13 17:53:03 pindabook NetworkManager[1313]: [1644771183.6312] Read config: /etc/NetworkManager/NetworkManager.conf feb 13 17:53:03 pindabook systemd[1]: Started Network Manager. feb 13 17:53:03 pindabook NetworkManager[1313]: [1644771183.6371] bus-manager: acquired D-Bus service "org.freedesktop.Netwo> feb 13 17:53:03 pindabook NetworkManager[1313]: [1644771183.6404] manager[0x55d95cfab070]: monitoring kernel firmware direct> feb 13 17:53:04 pindabook NetworkManager[1313]: [1644771184.1745] hostname: hostname: using hostnamed ... feb 13 18:37:30 pindabook NetworkManager[1313]: [1644773850.4020] dhcp4 (eth1): option routers => '192.168.1.1' feb 13 18:37:30 pindabook NetworkManager[1313]: [1644773850.4020] dhcp4 (eth1): option subnet_mask => '255.255.255.> feb 13 18:37:30 pindabook NetworkManager[1313]: [1644773850.4020] dhcp4 (eth1): state changed extended -> extended
Om enkel kernel berichten weer te geven, gebruik je de -k
(--dmesg
) optie.
We kunnen journald berichten filteren op datum met twee opties: -S
(--since
) en -U
(--until
).
Beide opties aanvaarden datums in het formaat YYYY-MM-DD hh:mm:ss
.
Als je de tijd weglaat, wordt automatisch 00:00:00
gebruikt.
dany@pindabook:~>sudo journalctl --since "2022-02-13 18:59:00" --until "2022-02-13 19:00:00"
-- Logs begin at Sun 2022-02-13 17:52:56 CET, end at Sun 2022-02-13 19:05:18 CET. -- feb 13 18:59:28 pindabook NetworkManager[1313]:[1644775168.0843] dhcp4 (eth1): address 192.168.1.9 feb 13 18:59:28 pindabook NetworkManager[1313]: [1644775168.0843] dhcp4 (eth1): plen 24 (255.255.255.0) feb 13 18:59:28 pindabook NetworkManager[1313]: [1644775168.0843] dhcp4 (eth1): gateway 192.168.1.1 ... feb 13 18:59:28 pindabook systemd[1]: Started Network Manager Script Dispatcher Service. feb 13 18:59:34 pindabook org_kde_powerdevil[1968]: powerdevil: Udev device changed "/sys/devices/pci0000:00/0000:00:02.0/drm/card0/> feb 13 18:59:38 pindabook systemd[1]: NetworkManager-dispatcher.service: Succeeded.
In plaats van volledige datums kan je de volgende aliassen gebruiken:
yesterday
: 00:00:00 van de vorige dagtoday
: vandaagtomorrow
: morgennow
: de huidige tijd (nu).Start je journalctl
met de optie -f
(--follow
) dan volg je de journald berichten terwijl ze zich voordoen.
Dit werkt zoals je de opdracht tail
met de optie -f
uitvoert.
Wil je enkel de laatste berichten weergeven, gebruik dan de optie -e
(--pager-end
).
De uitvoer die we ontvangen van journalctl
kunnen we opmaken met de optie -o
(--output
).
Deze optie heeft als belangrijkste waarden:
De standaard short
uitvoer beperkt de uitvoer tot één regel per bericht:
dany@pindabook:~>sudo journalctl --since "2022-02-14 17:52:14" --until "2022-02-14 17:52:15" -u NetworkManager
[sudo] wachtwoord voor root: -- Logs begin at Mon 2022-02-14 17:52:07 CET, end at Mon 2022-02-14 18:30:44 CET. -- feb 14 17:52:14 pindabook systemd[1]: Starting Network Manager... feb 14 17:52:14 pindabook NetworkManager[1381]:[1644857534.7907] NetworkManager (version 1.22.10) is starting... (for the f> feb 14 17:52:14 pindabook NetworkManager[1381]: [1644857534.7907] Read config: /etc/NetworkManager/NetworkManager.conf feb 14 17:52:14 pindabook systemd[1]: Started Network Manager. feb 14 17:52:14 pindabook NetworkManager[1381]: [1644857534.7950] bus-manager: acquired D-Bus service "org.freedesktop.Netwo> feb 14 17:52:14 pindabook NetworkManager[1381]: [1644857534.7985] manager[0x5580d740a070]: monitoring kernel firmware direct
Deze uitvoer kan je verder beperken door te filteren met zoektermen.
Daarvoor gebruik je de optie -g
(--grep
):
dany@pindabook:~> sudo journalctl --since "2022-02-14 17:52:14" --until "2022-02-14 17:52:15" -u NetworkManager -g "Started Network Manager"
-- Logs begin at Mon 2022-02-14 17:52:07 CET, end at Mon 2022-02-14 18:34:43 CET. --
feb 14 17:52:14 pindabook systemd[1]: Started Network Manager.
De verbose
uitvoer toont alle velden van het bericht:
dany@pindabook:~> sudo journalctl --since "2022-02-14 17:52:14" --until "2022-02-14 17:52:15" -u NetworkManager -g "Started Network Manager" -o verbose
-- Logs begin at Mon 2022-02-14 17:52:07 CET, end at Mon 2022-02-14 18:36:30 CET. --
Mon 2022-02-14 17:52:14.794983 CET [s=404702ed20bc4850892ffa63085c743b;i=510;b=e3d175a0d11749dd85295bdb3f460d6a;m=a82196;t=5d7fd3d11>
PRIORITY=6
_BOOT_ID=e3d175a0d11749dd85295bdb3f460d6a
_MACHINE_ID=ce5361ac5e594fd69d023ca57cadfb7e
_HOSTNAME=pindabook
SYSLOG_FACILITY=3
SYSLOG_IDENTIFIER=systemd
_UID=0
_GID=0
_SELINUX_CONTEXT=unconfined
_TRANSPORT=journal
CODE_FILE=src/core/job.c
CODE_LINE=948
CODE_FUNC=job_log_done_status_message
JOB_TYPE=start
JOB_RESULT=done
MESSAGE_ID=39f53479d3a045ac8e11786248231fbf
_PID=1
_COMM=systemd
_EXE=/usr/lib/systemd/systemd
_CAP_EFFECTIVE=ffffffffff
_SYSTEMD_CGROUP=/init.scope
_SYSTEMD_UNIT=init.scope
_SYSTEMD_SLICE=-.slice
_CMDLINE=/usr/lib/systemd/systemd --switched-root --system --deserialize 29
JOB_ID=271
UNIT=NetworkManager.service
INVOCATION_ID=9b67aa38565c4fea81dd7f08284dc69c
MESSAGE=Started Network Manager.
_SOURCE_REALTIME_TIMESTAMP=1644857534794983
Terwijl de json-pretty
uitvoer zorgt voor een leesbaar JSON-object:
dany@pindabook:~> sudo journalctl --since "2022-02-14 17:52:14" --until "2022-02-14 17:52:15" -u NetworkManager -g "Started Network Manager" -o json-pretty
Wil je nog meer uit journald halen, raadpleeg dan de handleidingen met de opdrachten man journald.conf
en man journalctl
.