Systémové logování v Linuxu prošlo zásadní transformací s příchodem systemd. Nyní se naučíme, jak efektivně využívat příkaz `journalctl` pro čtení a filtrování zpráv systémového logu.
Centralizovaná správa logů
Není překvapením, že systemd, jakožto správce systémů a služeb, přinesl významné změny v oblasti shromažďování systémových logů. Dříve byly logy rozptýleny po různých místech v souborovém systému, závisle na službě či démonu, který je generoval. Jedním společným rysem však bylo, že se jednalo o prosté textové soubory.
S příchodem systemd se veškeré systémové, bootovací i kernel logy shromažďují a spravují pomocí centralizovaného a specializovaného logovacího řešení. Formát uložení dat je binární. To usnadňuje například extrakci dat v rozličných formátech, jako je JSON, jak si ukážeme.
Tento centralizovaný přístup rovněž usnadňuje vzájemné odkazování na související informace, které by dříve byly zaznamenány v oddělených souborech. Jelikož jsou data uložena v jediném deníku, je možné vybrat záznamy z různých zdrojů a zobrazit je v jednolitém propleteném seznamu.
`journalctl` je nástroj, který se používá pro manipulaci s tímto deníkem.
Základní použití journalctl
Příkaz `journalctl` lze spustit bez jakýchkoli parametrů:
journalctl
Tímto způsobem `journalctl` zobrazí celý žurnál, přičemž nejstarší záznamy budou uvedeny na začátku. Výstup je zobrazen pomocí `less`, což umožňuje navigaci a vyhledávání pomocí běžných funkcí. Pro posun vodorovně a čtení širších položek můžete použít šipky doleva a doprava.
Stiskem klávesy End se přesunete na konec seznamu, tedy k nejnovějším záznamům.
K ukončení výpisu stiskněte Ctrl+C.
Ačkoli je možné `journalctl` volat bez `sudo`, doporučuje se jej používat s `sudo`, aby byly zobrazeny všechny detaily v logu.
sudo journalctl
Pokud si přejete, můžete výstup `journalctl` posílat přímo do terminálu namísto `less` pomocí volby `–no-pager`.
sudo journalctl --no-pager
Výstup se rychle zobrazí v terminálu a vrátí se do příkazové řádky.
Pro omezení počtu řádků ve výstupu `journalctl` můžete použít volbu `-n` (počet řádků). Například pro zobrazení posledních deseti řádků použijte následující příkaz:
sudo journalctl -n 10
Sledování nových záznamů
Chcete-li sledovat nejnovější záznamy, které se přidávají do deníku v reálném čase, použijte volbu `-f` (follow).
sudo journalctl -f
Nejnovější záznam má časové razítko 07:09:07. Jakmile dojde k nové aktivitě, nové položky se přidávají na konec výpisu. To poskytuje aktualizace téměř v reálném čase, což je velmi užitečné!
V 07:09:59 aplikace s názvem „geek-app“ přidala do deníku záznam s textem „Nová zpráva od HTG“.
Změna formátu zobrazení
Protože je žurnál binární, data v něm musejí být před zobrazením přeložena do textové podoby. Různé analyzátory mohou ze stejných binárních dat vygenerovat odlišné výstupní formáty. `journalctl` podporuje několik formátů zobrazení.
Výchozí formát výstupu je „short“, který je velmi podobný klasickému formátu systémového logu. Pro explicitní vyžádání krátkého formátu použijte volbu `-o` (output) s modifikátorem `short`.
sudo journalctl -n 10 -o short-full
Zleva doprava jsou sloupce s následujícími informacemi:
- Čas vytvoření zprávy v místním čase.
- Název hostitele.
- Název procesu. Jedná se o proces, který zprávu vygeneroval.
- Text logové zprávy.
Chcete-li získat kompletní datum a čas, použijte modifikátor `short-full`:
sudo journalctl -n 10 -o short-full
Formát data a času v tomto výstupu je formát, který musíte použít, když chcete vybírat zprávy logu podle časového období, jak si ukážeme později.
Pro zobrazení všech metadat, která jsou s každou logovou zprávou spojena, použijte podrobný modifikátor `verbose`.
sudo journalctl -n 10 -o verbose
Existuje mnoho možných polí, ale ne všechna pole jsou vždy přítomna v každé zprávě.
Jedno pole, které stojí za zmínku, je „Priorita“. V tomto příkladě má hodnotu 6. Hodnota představuje důležitost zprávy:
- 0: Pohotovost. Systém je nepoužitelný.
- 1: Upozornění. Stav, který by měl být okamžitě opraven.
- 2: Kritický. Pády, výpadky jádra a významná selhání aplikací.
- 3: Chyba. Byla hlášena chyba, která není považována za vážnou.
- 4: Varování. Upozornění na podmínku, která se může stát chybou.
- 5: Upozornění. Používá se pro hlášení neobvyklých událostí.
- 6: Informace. Běžné provozní zprávy bez nutnosti akce.
- 7: Ladění. Zprávy vkládané do aplikací pro ladění.
Chcete-li zobrazit výstup ve formátu JSON, použijte modifikátor `json`:
sudo journalctl -n 10 -o json
Každá zpráva je správně zabalena jako JSON objekt a zobrazuje se jedna zpráva na řádek.
Pro formátovaný JSON výstup použijte modifikátor `json-pretty`.
sudo journalctl -n 10 -o json-pretty
Každý objekt JSON je rozdělen na několik řádků, kde je každý pár klíč-hodnota na novém řádku.
Pro zobrazení pouze textu logových zpráv, bez časových razítek a dalších metadat, použijte modifikátor `cat`:
sudo journalctl -n 10 -o cat
Tento formát zobrazení může ztížit identifikaci procesu, který událost vyvolal, i když některé zprávy obsahují nápovědu.
Výběr logů podle časového období
Chcete-li omezit výstup z `journalctl` na konkrétní časové období, použijte volby `-S` (od) a `-U` (do).
Pro zobrazení logů od určitého data a času, použijte následující příkaz:
sudo journalctl -S "2020-91-12 07:00:00"
Zobrazí se pouze zprávy, které dorazily po zadaném datu a času.
Pro definování časového období použijte volby `-S` (od) a `-U` (do) společně. Následující příkaz zobrazí logy za 15minutové období:
sudo journalctl -S "2020-91-12 07:00:00" -U "2020-91-12 07:15:00"
Toto je užitečná kombinace, pokud víte, že se něco zvláštního stalo ve vašem systému a přibližně kdy.
Použití relativních časových období
Při výběru časových období můžete použít relativní adresování. Například pro zobrazení všech událostí od jednoho dne až do současnosti můžete použít následující příkaz: „d“ znamená „den“ a „-1“ jeden den v minulosti.
sudo journalctl -S -1d
Zobrazí se logy od včerejšího 00:00:00 do „nyní“.
Pro prozkoumání událostí z nedávné minulosti můžete určit relativní časové období měřené v hodinách. Následující příkaz zobrazí logy za poslední hodinu:
sudo journalctl -S -1h
Zobrazí se logy za poslední hodinu. Můžete také použít „m“ pro minuty a „w“ pro týdny.
`journalctl` chápe i výrazy „dnes“, „včera“ a „zítra“. Pro zobrazení všech událostí, které se staly včera, použijte následující příkaz:
sudo journalctl -S yesterday
Zobrazí se všechny logové události z včerejšího dne do půlnoci (00:00:00).
Pro zobrazení všech logů od začátku dnešního dne až do aktuálního času použijte následující příkaz:
sudo journalctl -S today
Zobrazí se všechny záznamy od 00:00:00 do okamžiku spuštění příkazu.
Různé modifikátory časových období lze kombinovat. Chcete-li zobrazit vše od před dvou dnů až do začátku dnešního dne, použijte následující příkaz:
sudo journalctl -S -2d -U today
Zobrazí se vše od předvčerejška do začátku dnešního dne.
Výběr logů podle datových polí
Zprávy logu můžete vyhledávat podle mnoha různých polí. Vyhledávání probíhá v metadatech spojených s každou zprávou. Doporučuje se podívat se na seznam polí a vybrat ta, která pro vás budou nejužitečnější.
Mějte na paměti, že zda aplikace vyplní každé pole či nikoli, záleží na autorech aplikace. Nelze zaručit, že budou vyplněna všechna pole.
Všechny modifikátory pro pole se používají stejným způsobem. Následující příklady ukáží několik z nich. Pro vyhledání logů konkrétní aplikace použijte modifikátor `_COMM` (příkaz). Pokud použijete také volbu `-f` (follow), `journalctl` bude sledovat nové zprávy z této aplikace, jakmile přijdou.
sudo journalctl -f _COMM=geek-app
Logy můžete vyhledávat také pomocí ID procesu. Pro vyhledání ID procesu démona či aplikace, kterou hledáte, použijte příkaz `ps`.
sudo journalctl _PID=751
Na stroji použitém pro tento článek má SSH démon ID procesu 751.
Můžete vyhledávat i podle ID uživatele. Jedná se o ID uživatele, který spustil aplikaci nebo příkaz, či který proces vlastní.
sudo journalctl _UID=1000
Všechny zprávy, které nesouvisí s ID uživatele 1000, budou odfiltrovány. Zobrazí se pouze zprávy od uživatele s ID 1000:
Dalším způsobem, jak vyhledávat logy související s konkrétní aplikací, je zadat cestu ke spustitelnému souboru.
sudo journalctl /usr/bin/anacron
Zobrazí se všechny logy plánovače `anacron`.
Pro usnadnění vyhledávání můžeme požádat `journalctl`, aby vypsal všechny hodnoty, které obsahuje pro konkrétní pole.
Pro zobrazení ID uživatelů, pro které `journalctl` zaznamenává logy, použijte volbu `-F` (field) a zadejte identifikátor pole `_UID`.
journalctl -F _UID
Podobně, pro vypsání ID skupiny (GID):
journalctl -F _GID
Toto můžete udělat s libovolným identifikátorem pole.
Zobrazení zpráv jádra
Existuje vestavěná možnost pro rychlou izolaci zpráv jádra. Nemusíte je sami vyhledávat. Volba `-k` (kernel) odstraní všechny ostatní zprávy a zobrazí pouze logy jádra.
sudo journalctl -k
Zvýraznění odráží důležitost zprávy podle hodnoty v poli Priorita.
Kontrola bootovacích zpráv
Pokud máte problémy související se spouštěním systému, `journalctl` vám může pomoci. Možná jste přidali nový hardware, který nereaguje, nebo dříve funkční komponenta přestala fungovat po poslední aktualizaci systému.
Pro zobrazení logů z posledního spuštění použijte volbu `-b` (boot):
journalctl -b
Zobrazí se záznamy logu z posledního spuštění.
Pod „posledním spuštěním“ se rozumí spouštěcí proces