Zpět na blog

Zobrazení a manipulace s protokoly Systemd pomocí Journalctl

Zobrazení a manipulace s protokoly Systemd pomocí Journalctl

Systémové a protokolování procesů jsou jen dvě z nejzásadnějších výhod systemd. Pokud jsou protokoly rozptýleny po celém systému, zahrnují více aplikací a jsou zpracovávány různými procesy a démony, může být jejich interpretace náročná. Systemd poskytuje centralizované řešení pro správu všech protokolů procesů jádra a uživatelského prostoru v kompilačním médiu známém jako journal. Více o systemd se můžete dozvědět v našem návodu, jak spravovat služby a jednotky systemd pomocí systemctl. Všechny zprávy generované službami, initrd, jádry atd. v journalu jsou zpracovávány démonem journalu. Účelem této příručky je ukázat, jak přistupovat k datům journalu a manipulovat s nimi pomocí journalctl.

Základní předpoklad

Bez ohledu na to, odkud zpráva pochází, jedním z hlavních cílů systemd je umožnit centralizaci jejich správy. Vzhledem k tomu, že o mnoho spouštěcích procesů a velkou část správy služeb se stará proces systemd, měl by být způsob sestavování protokolů a přístupu k nim standardizován. Journald shromažďuje data ze všech dostupných zdrojů do jednoho komplexního nástroje a ukládá je v binárním formátu. To umožňuje, aby byla data snadno dostupná pro dynamickou a jednoduchou manipulaci.

Tento přístup má několik klíčových výhod. Díky centrálnímu místu pro shromažďování všech dat mohou administrátoři filtrovat a zobrazovat pouze ta data, která potřebují. Například lze zobrazit data o spouštění ze stavu před třemi spuštěními systému. Může to také znamenat sekvenční protokolování záznamů ze souvisejících služeb a efektivnější sledování problémů s komunikací mezi nimi.

Díky binárnímu úložišti lze data zobrazovat v různých výstupních formátech v závislosti na aktuálních potřebách uživatele. Například denní protokol lze zobrazit ve standardním formátu syslog. Pokud však potřebujete sledovat trendy přerušení služeb v podobě grafu, lze záznam exportovat jako JSON objekt, což umožňuje jeho použití s grafickou službou. Pokud potřebujete změnit formáty v závislosti na situaci, není nutná žádná konverze, protože data jsou binární a nezapisují se na disk jako prostý text.

V závislosti na potřebách můžete journal systemd implementovat se stávajícím syslogem, nebo může jeho funkci zcela nahradit. Systemd může stávající mechanismy protokolování dokonce doplňovat. Například u více služeb na jednom systému mohou být jejich shromážděná data v rámci jednoho systému propojena s journalem systemd.

Nastavení systémového času

Systemd bude ve výchozím nastavení zobrazovat výsledky v místním čase, což je výhoda binárního protokolování journalu v tom, jak lze záznamy prohlížet. Alternativně je lze zobrazit v UTC. Proto je důležité se před zahájením protokolování do journalu ujistit, že je správně nastavena časová zóna. K tomuto účelu je systemd vybaven nástrojem s názvem timedatectl. Začneme tím, že zjistíme, jaké časové zóny jsou k dispozici, zobrazením seznamu pomocí volby list-timezones:

Po nalezení časové zóny odpovídající umístění vašeho serveru lze časovou zónu nastavit pomocí volby set-timezone:

Chcete-li otestovat a ověřit, zda se časové pásmo nyní zobrazuje správně, můžete použít příkaz timedatectl buď samostatně, nebo s přidáním „status“:

timedatectl status

První řádek znázorňuje místní čas. Tento řádek by měl obsahovat správný čas pro váš místní region.

Obecné prohlížení protokolů

Příkaz journalctl vám umožní zobrazit protokoly, které démon journald shromáždil. Při použití journalctl se na stránce obrazovky zobrazí každý záznam journalu ze systému, přičemž nejstarší záznamy jsou uvedeny nahoře. Úplný seznam dat však bude dlouhý desítky tisíc řádků.

journalctl

Ti, kteří používali standardní protokolování syslog, shledají tento formát povědomým, ale je důležité mít na paměti, že tato kompilace dat je na rozdíl od metody syslog zahrnuta z mnoha zdrojů. Protokoly budou zahrnovat raný proces spouštění, initrd a jádro, stejně jako standardní chyby aplikací.

Nyní, když je nastaven místní čas, budou všechny záznamy začínat časovými razítky v místním čase, což je k dispozici pro každý protokol aktuálně uložený v systému, přičemž veškerá logika se zobrazuje pomocí těchto nových informací. Nejste však omezeni pouze na místní čas. Pomocí příznaku –utc můžete zobrazit časová razítka také v UTC:

Filtrování žurnálu podle času

Mít k dispozici tolik dat je fantastické, ale procházet je a dokázat je vstřebat, nemluvě o jejich mentálním zpracování, může být skličující úkol. S ohledem na to se dostáváme k nejdůležitější části funkce journalctl: filtrování.

Zobrazení protokolů z aktuálního spuštění

Pokud hledáte data v žurnálu z posledního restartu, můžete použít funkci journalctl s příznakem -b. Tím se zobrazí všechny relevantní informace protokolu z posledního restartu vašeho systému. Tento příkaz vám umožní najít a spravovat informace, které jsou nejrelevantnější pro aktuální pracovní prostředí:

Pokud se prohlížející rozhodne nehodnotit každý jednotlivý záznam, journalctl zobrazí více než den spuštění, která se v journalctl zobrazí s praktickými oddělovači „Reboot“. To pomáhá logicky oddělit informace z různých relací spouštění pro účely kontroly:

Informace o předchozích spuštěních

Zatímco zobrazování informací o aktuálním spuštění bývá nejužitečnější, existují situace, kdy se mohou hodit informace o předchozích spuštěních. Žurnál ukládá informace o několika předchozích spuštěních, takže journalctl může snadno zobrazit informace pro jakékoli časové období.

Některé distribuce ukládání informací o předchozích spuštěních zakazují, zatímco jiné je mají ve výchozím nastavení povolené. Povolení trvalého ukládání informací o spuštění lze provést vytvořením adresáře pro ukládání žurnálu zadáním následujícího příkazu:

Případně můžete konfigurační soubor žurnálu upravit následujícím způsobem:

Nastavením volby Storage= na „persistent“ v sekci [Journal] povolíte trvalé protokolování:

journalctl configuration

Jakmile je tato možnost povolena, journalctl zpřístupní určité příkazy, které vám pomohou označit tato spuštění jako jednotky rozdělení. Chcete-li zobrazit spuštění, která byla zaznamenána v journald, můžete použít volbu –list-boots prostřednictvím journalctl:

list boots journalctl

Jak je znázorněno, každé spuštění bude uvedeno na samostatném řádku, přičemž první sloupec odráží předchozí spuštění v pořadí od nejstaršího po nejnovější. Pokud je vyžadován absolutnější odkaz, druhý sloupec obsahuje identifikaci spuštění. Poté jsou uvedeny dvě časové specifikace. K zobrazení informací o žurnálu z konkrétního spuštění lze použít informace z prvního nebo druhého sloupce. Můžete například použít příznak -b s relativním ukazatelem spuštění -1 pro zobrazení informací o druhém nejnovějším restartu:

Podobně lze tímto způsobem použít také ID spuštění z druhého sloupce:

Časová okna

Zobrazení spuštění podle ID je jednou z možností, ale často je užitečnější mít možnost odkazovat na předchozí spuštění pomocí časového okna v minulosti, které nemusí nutně odpovídat konkrétním spuštěním. To je relevantní například v situaci, kdy pracujete s dlouho běžícími servery, které se nerestartují často. Filtrování časových limitů lze provádět s libovolnými časovými limity. Tím se zobrazí pouze informace o restartech, které spadají do konkrétního časového okna. Parametry tohoto okna se určují pomocí voleb –since a –until. Pro časové volby je k dispozici několik formátů. Formát absolutní časové hodnoty je následující:

Pokud tedy chcete vidět všechna spuštění od 10. ledna 2015 v 17:15, zadejte následující příkaz:

Pokud jsou některé součásti vynechány, použijí se vestavěné výchozí hodnoty. Pokud je vynecháno datum, použije se aktuální datum. Pokud chybí časová složka, výchozím nastavením je půlnoc (00:00:00). Pokud u časové složky vynecháte sekundy, nastaví se jako výchozí počáteční bod dané minuty (00):

Journal dokáže porozumět časovým zkratkám jako „today“, „tomorrow“, „yesterday“ a „now“. Slova jako „ago“ ve spojení s předřazenými kvalifikátory „-“ a „+“ lze použít k sestavení příkazu větného typu:

Pokud jste byli upozorněni na přerušení služby, které začalo v 9:00, a chcete zkontrolovat protokoly journalu až do doby před hodinou, můžete tak učinit následovně:

Jak je vidět, definování flexibilního časového okna pro zobrazení požadovaných záznamů je velmi jednoduché.

Filtrování podle zájmu o zprávy

Kromě filtrování journalu podle časových omezení lze data filtrovat také na základě konkrétní služby, která vás zajímá. Systemd k tomu poskytuje několik metod.

Podle jednotky

Pravděpodobně nejužitečnějším parametrem filtrování je filtrování podle jednotky, která vás zajímá. K filtrování podle jednotky lze využít volbu -u. Pokud například chcete zobrazit všechny protokoly týkající se jednotky Nginx, zadejte následující příkaz:

V reálném provozu budete pravděpodobně chtít toto filtrování spojit s časovým filtrem, abyste zobrazili relevantní řádky. Pokud chcete zkontrolovat výše uvedenou službu a její dnešní výkon, můžete provést následující:

To je užitečné zejména při využití schopnosti journalu shromažďovat záznamy z více jednotek, zejména těch, které spolupracují. Pokud je proces Nginx připojen k jednotce PHP-FPN pro zpracování dynamického obsahu, lze záznamy sloučit v chronologickém pořadí zadáním obou jednotek:

To může výrazně pomoci při sledování interakce programů a usnadnit ladění systémů namísto jednotlivých procesů.

Podle ID skupiny, procesu nebo uživatele

Mnoho služeb spouští velké množství podprocesů (dceřiných procesů) k provádění specifické práce. Pokud je k dispozici ID konkrétního procesu, lze jej také filtrovat zadáním pole _PID. Pokud je hledané PID 8088, lze provést následující:

Možná budete chtít také zobrazit záznamy protokolované od konkrétní skupiny nebo konkrétního uživatele. Toho lze dosáhnout pomocí filtrů _GID a _UID. Pokud webový server běží pod uživatelem www-data, lze potřebné ID zjistit následovně:

find id

Pomocí tohoto ID pak můžete zobrazit odpovídající výsledky z journalu:

Systemd zpřístupňuje mnoho polí pro účely filtrování. Některá pole jsou aplikována službou journald na základě informací shromážděných ze systému v době logování, zatímco jiná jsou předávána z aktuálně logovaného procesu.

Předpona _PID značí, že informace byla shromážděna ze systému v době logování. Journal automaticky zaznamenává a indexuje PID během procesu logování, aby bylo filtrování později k dispozici. Chcete-li zjistit dostupná pole journalu, můžete zadat:

Některým z nich se budeme věnovat později v této příručce, ale prozatím se dotkneme několika dalších užitečných možností týkajících se těchto polí. Pokud chcete vidět všechny dostupné hodnoty pro konkrétní pole journalu, můžete použít volbu -F. Pokud si přejete zjistit, jaké ID skupin má systemd journal k dispozici, můžete provést následující:

possible gid Journalctl

To může pomoci při sestavování filtrů tím, že získáte úplný seznam hodnot, které má pole ID skupiny v journalu uložené.

Podle cesty ke komponentě

Filtrování lze provádět také zadáním cesty. Pokud cesta vede ke spustitelnému souboru, zobrazí se v journalctl záznamy, které se tohoto spustitelného souboru týkají. Pokud je hledaným spustitelným souborem „bash“, můžete zadat:

Ačkoliv to někdy není možné, pokud je k dispozici unit (jednotka) daného spustitelného souboru, může to poskytnout přehlednější a informativnější způsob filtrování.

Zobrazení zpráv jádra

Zprávy jádra, které se obvykle nacházejí ve výstupu dmesg, lze také získat z journalu. Abychom zobrazili pouze tyto zprávy, použijeme jako součást příkazu přepínač -k nebo -dmesg:

Ve výchozím nastavení se zobrazí zprávy z aktuálního spuštění systému (bootu), ale předchozí spuštění lze specifikovat pomocí dříve zmíněného výběrového přepínače. Pokud hledáte zprávy z doby před pěti spuštěními, zadáním tohoto příkazu získáte potřebné výsledky:

Podle priority

Systémoví administrátoři často preferují filtrování podle priority. Protokoly s nízkou prioritou, i když je často užitečné si je prohlédnout, mohou být matoucí a obsahovat mnoho rušivých prvků, což ztěžuje jejich analýzu. Použití volby -p v journalctl zobrazí pouze zprávy se specifikovanou prioritou a ostatní priority odfiltruje. Pokud si přejete zobrazit záznamy od úrovně chyb (error) výše, zadejte následující:

Tento příkaz vrátí všechny zprávy označené jako chyby (error), varování (alert), nouzové stavy (emergency) nebo kritické stavy (critical), přičemž journal využívá standardní úrovně zpráv syslogu. Úrovně priorit jsou definovány podle číselné hodnoty, seřazené od nejvyšší po nejnižší:

  • 0: emerg
  • 1: alert
  • 2: crit
  • 3: err
  • 4: warning
  • 5: notice
  • 6: info
  • 7: debug

Kteroukoli z výše uvedených možností lze zaměnitelně použít s volbou -p. Výběrem kterékoli z výše uvedených priorit odfiltrujete všechny priority na této úrovni a vyšší.

Úprava zobrazení v journalu

Kromě použití filtrování pro výběr záznamů máme k dispozici i další metody úpravy výstupu, které přizpůsobí zobrazení journalctl našim potřebám.

Zkrácení/rozšíření výstupu

Zobrazení výstupu můžeme upravit nastavením toho, zda journalctl data zkrátí nebo rozšíří. Výchozím chováním journalctl je zobrazit celý záznam, přičemž delší záznamy pokračují mimo pravý okraj obrazovky. Celé záznamy si můžete prohlédnout posouváním pomocí klávesy se šipkou doprava. Uživatel může místo toho chtít výstup zkrátit, přičemž na řádcích, které by jinak přetékaly mimo obrazovku, se zobrazí výpustka. K tomu lze použít volbu –no-full:

no full option Journalctl

Případně můžete také povolit zobrazení všeho bez ohledu na délku nebo přítomnost netisknutelných znaků pomocí přepínače -a:

Výstup na standardní výstup

Journalctl ve výchozím nastavení zobrazuje výstup v pageru, ale pokud chcete s daty manipulovat pomocí nástrojů pro úpravu textu, pravděpodobně budete potřebovat, aby byl výstup generován do standardního výstupu. Toho můžete dosáhnout pomocí volby –no-pager:

V závislosti na potřebách uživatele může být tento výstup přesměrován do souboru na disku nebo do nástroje pro zpracování.

Formáty výstupu

Data se vždy snáze analyzují, pokud jsou prezentována v lépe stravitelném formátu. Journal poskytuje několik možností zobrazení pomocí parametru -o následovaného konkrétně určeným formátem.

Pokud chcete vypsat záznamy journalu ve formátu JSON, můžete tak učinit následujícím způsobem:

service logs in json

Tato strategie je užitečná zejména pro nástroje na analýzu dat. Formát json-pretty může lépe zobrazit datové struktury předtím, než je předáte zpracovateli JSON:

output format json pretty Journalctl

Pro zobrazení můžete využít několik formátů:

  • cat: Zobrazuje pouze samotné pole zprávy.
  • export: Binární formát vhodný pro přenos nebo zálohování.
  • json: Standardní JSON s jedním záznamem na řádek.
  • json-pretty: JSON formátovaný pro lepší lidskou čitelnost
  • json-sse: Výstup ve formátu JSON zabalený tak, aby byl kompatibilní s událostmi odesílanými serverem (server-sent events)
  • short: Výchozí výstup ve stylu syslog
  • short-iso: Výchozí formát rozšířený o zobrazení časových razítek reálného času podle ISO 8601.
  • short-monotonic: Výchozí formát s monotonními časovými razítky.
  • short-precise: Výchozí formát s přesností na mikrosekundy
  • verbose: Zobrazuje každé dostupné pole journalu pro daný záznam, včetně těch, která jsou obvykle interně skrytá.

Výše uvedené volby umožňují zobrazit journal ve vašem preferovaném formátu.

Aktivní monitorování procesů

Journal umožňuje přístup k funkcím monitorování aktivní nebo nedávné činnosti bez nutnosti zapojení dalšího nástroje. Toho můžete dosáhnout pomocí příkazu journalctl s funkcí „tail“.

  • Zobrazení nedávných protokolů

Použití volby -n (která funguje stejně jako příkaz tail -n) umožní zobrazit určitý počet záznamů:

Počet záznamů, které chcete nechat zobrazit, lze specifikovat konkrétním číslem za parametrem -n:

  • Sledování protokolů v reálném čase

Protokoly můžete také aktivně sledovat při jejich zápisu do systému pomocí příznaku -f. To funguje stejným způsobem jako příkaz tail -f:

Údržba journalu

Protokoly zabírají místo. Stojí za to se tím zabývat, případně promazat některé starší protokoly, abyste uvolnili místo.

Zjištění aktuálního využití disku

Příznak –disk-usage může pomoci zjistit, kolik místa na disku protokolování aktuálně zabírá:

disk usage Journalctl

Mazání starých protokolů

Od verze systemd 218 (a v následujících verzích) můžete journal zmenšit dvěma různými způsoby. Jedním z nich je volba –vacuum-size. Ta dokáže zmenšit journal určením jeho velikosti. Jinými slovy, starší záznamy budou z protokolu odstraňovány, dokud obsazené místo neklesne na požadovaný parametr:

Volba –vacuum-time může zmenšit prostor obsazený journalem určením mezního času, přičemž všechny záznamy starší než tento čas budou smazány, zatímco záznamy vytvořené po zadaném čase budou zachovány. Pokud si přejete ponechat záznamy pouze za poslední kalendářní rok, můžete použít:

Omezení růstu journalu

Můžete také omezit množství místa, které bude journal zabírat. Toho docílíte úpravou souboru /etc/systemd.journald.conf. Růst journalu lze omezit použitím kterékoli z následujících metod:

  • SystemMaxUse=: Určuje maximální diskový prostor, který smí journal využívat v trvalém úložišti.
  • SystemKeepFree=: Určuje, kolik místa by mělo zůstat volného při přidávání entit journalu do trvalého úložiště.
  • SystemMaxFileSize=: Určuje, jak velké mohou být soubory žurnálu, než dojde k jejich rotaci v trvalém úložišti.
  • RuntimeMaxUse=: Určuje, kolik místa na disku je povoleno využít v dočasném úložišti (v rámci souborového systému /run).
  • RuntimeKeepFree=: Při zápisu dat do dočasného úložiště tato funkce udává množství místa, které musí být vyhrazeno pro jiné účely (v rámci souborového systému /run).
  • RuntimeMaxFileSize=: Udává, kolik místa může zabírat jednotlivý žurnál protokolů v dočasném úložišti (v rámci souborového systému /run), než bude muset být rozdělen.

Všechny tyto možnosti mohou pomoci řídit spotřebu úložného prostoru žurnálem. Důležitým faktem, který je třeba poznamenat, je, že volby SystemMaxFileSize a RuntimeMaxFileSize se budou zaměřovat na archivované soubory, aby dosáhly stanovených limitů. To je důležitý fakt, který je třeba mít na paměti při interpretaci počtu souborů po operacích promazání (vacuuming).

Závěr

Je zřejmé, že žurnál systemd je neuvěřitelně užitečný nástroj, přičemž většina jeho výhod pramení z centralizované povahy protokolů’ a rozsáhlého množství zaznamenávaných metadat. Rozsáhlé funkce žurnálu lze využít pomocí příkazu journalctl, což usnadňuje provádění relačního ladění komponent aplikací a také rozsáhlou analýzu systému.

Příjemnou práci s počítačem!

author

Akshay Nagpal

Autor · CloudSigma

Preslav Dobrev je kreativní designér ve společnosti CloudSigma, který se zaměřuje na konzistentní firemní identitu prostřednictvím tradičních i inovativních marketingových kanálů. Je zdatný v propojování umělecké vize se strategickým marketingem za účelem vytváření působivých příběhů značky.

Komentáře

Zatím žádné komentáře. Buďte první.