Správa zpráv protokolu pod Systemd pomocí Journalctl [Komplexní příručka]
Systemd je špičkový správce systému a služeb pro systémy Linux: náhrada init démona určená ke spouštění procesů paralelně při spouštění systému. Nyní je podporována v řadě současných mainstreamových distribucí včetně Fedory, Debianu, Ubuntu, OpenSuSE, Arch, RHEL, CentOS atd.
Dříve jsme vysvětlili příběh za „init“ a „systemd“; kde jsme diskutovali o tom, co jsou tito dva démoni, proč je „init“ technicky potřeba nahradit „systemd“, a také o hlavních funkcích systemd.
Jednou z hlavních výhod systemd oproti jiným běžným init systémům je podpora centralizované správy systémových a procesů logování pomocí žurnálu. V tomto článku se naučíme, jak spravovat a zobrazovat zprávy protokolu pod systemd pomocí příkazu journalctl v Linuxu.
Důležité: Než přejdete dále v této příručce, možná budete chtít zjistit, jak spravovat služby a jednotky 'Systemd' pomocí příkazu 'Systemctl' a také vytvářet a spouštět nové servisní jednotky v systemd pomocí skriptů shellu v Linuxu. Pokud však souhlasíte se vším výše uvedeným, pokračujte ve čtení.
Konfigurace žurnálu pro shromažďování zpráv protokolu pod Systemd
journald je démon, který shromažďuje a zapisuje záznamy do deníku z celého systému; jedná se v podstatě o zaváděcí zprávy, zprávy z jádra a ze syslogu nebo různých aplikací a všechny zprávy ukládá na centrální místo – soubor žurnálu.
Chování journald můžete ovládat pomocí jeho výchozího konfiguračního souboru: /etc/systemd/journald.conf, který je generován při kompilaci. Tento soubor obsahuje volby, jejichž hodnoty můžete změnit tak, aby vyhovovaly vašim požadavkům na místní prostředí.
Níže je ukázka toho, jak soubor vypadá, zobrazený pomocí příkazu cat.
cat /etc/systemd/journald.conf
See journald.conf(5) for details.
[Journal]
#Storage=auto
#Compress=yes
#Seal=yes
#SplitMode=uid
#SyncIntervalSec=5m
#RateLimitInterval=30s
#RateLimitBurst=1000
#SystemMaxUse=
#SystemKeepFree=
#SystemMaxFileSize=
#SystemMaxFiles=100
#RuntimeMaxUse=
#RuntimeKeepFree=
#RuntimeMaxFileSize=
#RuntimeMaxFiles=100
#MaxRetentionSec=
#MaxFileSec=1month
#ForwardToSyslog=yes
#ForwardToKMsg=no
#ForwardToConsole=no
#ForwardToWall=yes
#TTYPath=/dev/console
#MaxLevelStore=debug
#MaxLevelSyslog=debug
#MaxLevelKMsg=notice
#MaxLevelConsole=info
#MaxLevelWall=emerg
Všimněte si, že různé konfigurační extrakty pro instalaci a použití balíčků v /usr/lib/systemd/*.conf.d/ a konfigurace doby běhu lze nalézt v /run/systemd/journald.conf. d/*.confkterý nemusíte nutně používat.
Povolit ukládání dat deníku na disk
Řada distribucí Linuxu včetně Ubuntu a jeho derivátů, jako je Linux Mint, ve výchozím nastavení neumožňuje trvalé ukládání zaváděcích zpráv na disk.
Je možné to povolit nastavením možnosti „Úložiště“ na „trvalé“, jak je uvedeno níže. Tím se vytvoří adresář /var/log/journal a v něm budou uloženy všechny soubory žurnálu.
sudo vi /etc/systemd/journald.conf
OR
sudo nano /etc/systemd/journald.conf
[Journal]
Storage=persistent
Pro další nastavení najděte význam všech možností, které mají být konfigurovány, v části “[Journal]” zadáním.
man journald.conf
Nastavení správného systémového času pomocí příkazu Timedatectl
Pro spolehlivou správu protokolů pod systemd pomocí služby journald se ujistěte, že nastavení času včetně časového pásma je v systému správné.
Chcete-li zobrazit aktuální nastavení data a času ve vašem systému, zadejte.
timedatectl
OR
timedatectl status
Local time: Thu 2017-06-15 13:29:09 EAT
Universal time: Thu 2017-06-15 10:29:09 UTC
RTC time: Thu 2017-06-15 10:29:09
Time zone: Africa/Kampala (EAT, +0300)
Network time on: yes
NTP synchronized: yes
RTC in local TZ: no
Chcete-li nastavit správné časové pásmo a případně systémový čas, použijte níže uvedené příkazy.
sudo timedatectl set-timezone Africa/Kampala
sudo timedatectl set-time “13:50:00”
Zobrazení zpráv protokolu pomocí příkazu Journalctl
journalctl je nástroj používaný k zobrazení obsahu žurnálu systemd (který je zapsán službou journald).
Chcete-li zobrazit všechny shromážděné protokoly bez jakéhokoli filtrování, zadejte.
journalctl
-- Logs begin at Wed 2017-06-14 21:56:43 EAT, end at Thu 2017-06-15 12:28:19 EAT
Jun 14 21:56:43 tecmint systemd-journald[336]: Runtime journal (/run/log/journal
Jun 14 21:56:43 tecmint kernel: Initializing cgroup subsys cpuset
Jun 14 21:56:43 tecmint kernel: Initializing cgroup subsys cpu
Jun 14 21:56:43 tecmint kernel: Initializing cgroup subsys cpuacct
Jun 14 21:56:43 tecmint kernel: Linux version 4.4.0-21-generic (buildd@lgw01-21)
Jun 14 21:56:43 tecmint kernel: Command line: BOOT_IMAGE=/boot/vmlinuz-4.4.0-21-
Jun 14 21:56:43 tecmint kernel: KERNEL supported cpus:
Jun 14 21:56:43 tecmint kernel: Intel GenuineIntel
Jun 14 21:56:43 tecmint kernel: AMD AuthenticAMD
Jun 14 21:56:43 tecmint kernel: Centaur CentaurHauls
Jun 14 21:56:43 tecmint kernel: x86/fpu: xstate_offset[2]: 576, xstate_sizes[2]
Jun 14 21:56:43 tecmint kernel: x86/fpu: Supporting XSAVE feature 0x01: 'x87 flo
Jun 14 21:56:43 tecmint kernel: x86/fpu: Supporting XSAVE feature 0x02: 'SSE reg
Jun 14 21:56:43 tecmint kernel: x86/fpu: Supporting XSAVE feature 0x04: 'AVX reg
Jun 14 21:56:43 tecmint kernel: x86/fpu: Enabled xstate features 0x7, context si
Jun 14 21:56:43 tecmint kernel: x86/fpu: Using 'eager' FPU context switches.
Jun 14 21:56:43 tecmint kernel: e820: BIOS-provided physical RAM map:
Jun 14 21:56:43 tecmint kernel: BIOS-e820: [mem 0x0000000000000000-0x00000000000
Jun 14 21:56:43 tecmint kernel: BIOS-e820: [mem 0x0000000000090000-0x00000000000
Jun 14 21:56:43 tecmint kernel: BIOS-e820: [mem 0x0000000000100000-0x000000001ff
Jun 14 21:56:43 tecmint kernel: BIOS-e820: [mem 0x0000000020000000-0x00000000201
Jun 14 21:56:43 tecmint kernel: BIOS-e820: [mem 0x0000000020200000-0x00000000400
Zobrazit zprávy protokolu založené na spouštění
Pomocí volby --list-boots
můžete zobrazit seznam čísel spouštění (vzhledem k aktuálnímu zavádění), jejich ID a časová razítka první a poslední zprávy odpovídající zavádění.
journalctl --list-boots
-1 9fb590b48e1242f58c2579defdbbddc9 Thu 2017-06-15 16:43:36 EAT—Thu 2017-06-15 1
0 464ae35c6e264a4ca087949936be434a Thu 2017-06-15 16:47:36 EAT—Thu 2017-06-15 1
Chcete-li zobrazit položky žurnálu z aktuálního spuštění (číslo 0), použijte přepínač -b
takto (stejný jako ukázkový výstup výše).
journalctl -b
a chcete-li zobrazit deník z předchozího spuštění, použijte relativní ukazatel -1
s volbou -b
, jak je uvedeno níže.
journalctl -b -1
Případně použijte boot ID takto.
journalctl -b 9fb590b48e1242f58c2579defdbbddc9
Filtrování zpráv protokolu na základě času
Chcete-li použít čas ve formátu UTC (Coordinated Universal Time), přidejte možnosti --utc
následovně.
journalctl --utc
Chcete-li zobrazit všechny záznamy od určitého data a času, např. 15. června 2017 v 8:15 zadejte tento příkaz.
journalctl --since "2017-06-15 08:15:00"
journalctl --since today
journalctl --since yesterday
Zobrazení posledních zpráv protokolu
Chcete-li zobrazit poslední zprávy protokolu (ve výchozím nastavení 10), použijte příznak -n
, jak je uvedeno níže.
journalctl -n
journalctl -n 20
Zobrazení zpráv protokolu generovaných jádrem
Chcete-li zobrazit pouze zprávy jádra, podobně jako výstup příkazu dmesg, můžete použít příznak -k
.
journalctl -k
journalctl -k -b
journalctl -k -b 9fb590b48e1242f58c2579defdbbddc9
Zobrazení zpráv protokolu generovaných jednotkami
Chcete-li zobrazit všechny položky deníku pro konkrétní jednotku, použijte přepínač -u
následovně.
journalctl -u apache2.service
Chcete-li vynulovat až k aktuálnímu spouštění, zadejte tento příkaz.
journalctl -b -u apache2.service
Chcete-li zobrazit protokoly z předchozího spuštění, použijte toto.
journalctl -b -1 -u apache2.service
Níže jsou uvedeny některé další užitečné příkazy:
journalctl -u apache2.service
journalctl -u apache2.service --since today
journalctl -u apache2.service -u nagios.service --since yesterday
Zobrazení zpráv protokolu generovaných procesy
Chcete-li zobrazit protokoly generované konkrétním procesem, zadejte jeho PID takto.
journalctl _PID=19487
journalctl _PID=19487 --since today
journalctl _PID=19487 --since yesterday
Zobrazení zpráv protokolu generovaných ID uživatele nebo skupiny
Chcete-li zobrazit protokoly generované konkrétním uživatelem nebo skupinou, zadejte jeho ID uživatele nebo skupiny takto.
journalctl _UID=1000
journalctl _UID=1000 --since today
journalctl _UID=1000 -b -1 --since today
Prohlížení protokolů generovaných souborem
Chcete-li zobrazit všechny protokoly generované souborem (případně spustitelným souborem), jako je spustitelný soubor D-Bus nebo spustitelné soubory bash, jednoduše napište.
journalctl /usr/bin/dbus-daemon
journalctl /usr/bin/bash
Zobrazení zpráv protokolu podle priority
Výstup můžete také filtrovat na základě priorit zpráv nebo rozsahů priorit pomocí parametru -p
. Možné hodnoty jsou: 0 – emerg, 1 – alert, 2 – crit, 3 – err, 4 – warning, 5 – notice, 6 – info, 7 – debug):
journalctl -p err
Chcete-li určit rozsah, použijte formát uvedený níže (emerg to warning).
journalctl -p 1..4
OR
journalctl -p emerg..warning
Zobrazení zpráv protokolu v reálném čase
Pomocí volby -f
(podobně jako funkce tail -f) můžete prakticky sledovat protokoly při jejich zapisování.
journalctl -f
Manipulace s formátováním zobrazení deníku
Pokud chcete řídit výstupní formátování záznamů deníku, přidejte příznak -o
a použijte tyto možnosti: cat, export, json, json-pretty, json-sse, short, short-iso, krátký-monotónní, krátký-přesný a verbózní (zkontrolujte význam voleb na stránce manuálu:
Možnost cat zobrazuje aktuální zprávu každého záznamu v deníku bez jakýchkoli metadat (časové razítko atd.).
journalctl -b -u apache2.service -o cat
Správa deníků v systému
Chcete-li zkontrolovat vnitřní konzistenci souboru deníku, použijte volbu --verify
. Pokud je vše v pořádku, výstup by měl indikovat PASS.
journalctl --verify
PASS: /run/log/journal/2a5d5f96ef9147c0b35535562b32d0ff/system.journal
491f68: Unused data (entry_offset==0)
PASS: /run/log/journal/2a5d5f96ef9147c0b35535562b32d0ff/system@816533ecd00843c4a877a0a962e124f2-0000000000003184-000551f9866c3d4d.journal
PASS: /run/log/journal/2a5d5f96ef9147c0b35535562b32d0ff/system@816533ecd00843c4a877a0a962e124f2-0000000000001fc8-000551f5d8945a9e.journal
PASS: /run/log/journal/2a5d5f96ef9147c0b35535562b32d0ff/system@816533ecd00843c4a877a0a962e124f2-0000000000000d4f-000551f1becab02f.journal
PASS: /run/log/journal/2a5d5f96ef9147c0b35535562b32d0ff/system@816533ecd00843c4a877a0a962e124f2-0000000000000001-000551f01cfcedff.journal
Smazání starých souborů deníku
Můžete také zobrazit aktuální využití disku pro všechny soubory žurnálu pomocí voleb --disk-usage
. Zobrazuje součet využití disku všemi archivovanými a aktivními soubory žurnálu:
journalctl --disk-usage
Chcete-li odstranit staré (archivované) soubory deníku, spusťte následující příkazy:
sudo journalctl --vacuum-size=50M #delete files until the disk space they use falls below the specified size
sudo journalctl --vacuum-time=1years #delete files so that all journal files contain no data older than the specified timespan
sudo journalctl --vacuum-files=4 #delete files so that no more than the specified number of separate journal files remain in storage location
Rotující soubory deníku
V neposlední řadě můžete pomocí volby --rotate
nařídit journald rotaci souborů žurnálu. Všimněte si, že tato direktiva se nevrátí, dokud není operace rotace dokončena:
sudo journalctl --rotate
Podrobný návod k použití a možnosti naleznete na manuálové stránce journalctl následovně.
man journalctl
Podívejte se na některé užitečné články.
- Správa procesu spouštění systému a služeb (SysVinit, Systemd a Upstart)
- Petiti – Open Source Log Analysis Tool pro Linux SysAdmins
- Jak nastavit a spravovat rotaci protokolu pomocí Logrotate v systému Linux
- lnav – Sledujte a analyzujte protokoly Apache z terminálu Linux
To je prozatím vše. Pomocí zpětné vazby níže můžete položit jakékoli otázky nebo přidat své myšlenky na toto téma.