Vyhledávání na webu

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.

  1. Správa procesu spouštění systému a služeb (SysVinit, Systemd a Upstart)
  2. Petiti – Open Source Log Analysis Tool pro Linux SysAdmins
  3. Jak nastavit a spravovat rotaci protokolu pomocí Logrotate v systému Linux
  4. 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.