A systemd saját naplórendszert futtat: ez a journal, amelyet a journalctl segítségével olvashatunk. Időnként nem árt ránézni a logokra.

A journal olvasása

Egy bizonyos unit üzenetei fordított (csökkenő) sorrendben egy bizonyos időpontig vagy adott időintervallumban:

# journalctl -r -u borgmatic.service -U "2023-01-22 07:00:00"
# journalctl --reverse --unit=borgmatic.service --since=-3w --until=-1w

Valósidejű logok (mint tail -f), ez is segített már észrevenni hibákat:

# journalctl -f
# journalctl -f -p notice

A legutóbbi boot-üzenetek listázása error és magasabb prioritással:

# journalctl -b -p err
# journalctl --boot --priority=err

Csak a kernel logok:

# journalctl -k
# journalctl --dmesg

Korábbi boot-üzenetek megőrzéséhez előbb létre kell hozni a /var/log/journal/ mappát. Ez akkor működik, ha a /etc/systemd/journald.conf konfigban Storage=auto beállítás szerepel, ez a default. (Tehát ha van mappa, akkor megőrzi a logokat, ha nincs, akkor nem.)

# mkdir -p /var/log/journal/

Korábbi bootok és boot-üzenetek listázása:

# journalctl --list-boots
# journalctl -b -5
# journalctl --boot=325b71c16d5145f19ef123b64383d04b

A journal tárolása

Ha a logok akkumulálása mellett döntünk, akkor nem árt gondoskodni a retencióról, különben folyamatosan nő a helyfoglalásuk. A logok maximális mérete, illetve életkora egy /etc/systemd/journald.conf.d/ mappában lévő, tetszőleges nevű konfigfájlban adható meg, lásd: man journald.conf. Pl. 10-retention.conf:

[Journal]
Storage=persistent
MaxRetentionSec=3month

Mivel a konfig több forrásból állhat össze, így nézhetjük meg teljességében:

$ systemd-analyze cat-config systemd/journald.conf

A logok aktuális helyfoglalása:

# journalctl --disk-usage

Az archív logok kézi törlése annak megadásával, mit tartunk meg:

# journalctl --vacuum-time=2w
# journalctl --vacuum-size=500M

A journal írása

Akár egyszerű felhasználóként is írhatunk üzeneteket a journalba (a syslogon keresztül a user facility-vel), amelyeket aztán le is tudunk kérdezni.

$ logger -p user.notice -t mytag "hello world"
$ journalctl -q -p err -t mytag

Az utóbbi JSON formátumban:

$ journalctl -p err -t mytag -o json | jq '{_TRANSPORT, SYSLOG_IDENTIFIER, __REALTIME_TIMESTAMP, PRIORITY, MESSAGE}'