Späť na blog

Zobrazenie a manipulácia s logmi Systemd pomocou Journalctl

Zobrazenie a manipulácia s logmi Systemd pomocou Journalctl

Systémové a logovanie procesov sú len dve z najdôležitejších výhod systemd. Keď sú logy rozptýlené po celom systéme, zahŕňajú viacero aplikácií a sú spracovávané rôznymi procesmi a démonmi, môže byť náročné ich interpretovať. Systemd poskytuje centralizované riešenie na správu všetkých logov procesov jadra a používateľského priestoru v kompilačnom médiu známom ako journal. Viac o systemd sa môžete dozvedieť v našom návode, ako spravovať služby a jednotky systemd pomocou systemctl. Všetky správy generované službami, initrd, jadrami atď. v journale sú spracovávané démonom journal. Účelom tejto príručky je ukázať, ako pristupovať k údajom journalu a manipulovať s nimi pomocou journalctl.

Základný predpoklad

Bez ohľadu na to, odkiaľ správa pochádza, jedným z hlavných cieľov systemd je umožniť centralizáciu ich správy. Keďže o väčšinu procesov spúšťania a správu služieb sa stará proces systemd, spôsob, akým sa logy zostavujú a pristupuje sa k nim, by mal byť štandardizovaný. Zhromažďovaním údajov zo všetkých dostupných zdrojov do jedného komplexného nástroja ich journald ukladá v binárnom formáte. To umožňuje, aby boli údaje okamžite k dispozícii pre dynamickú a jednoduchú manipuláciu.

Tento prístup má niekoľko kľúčových výhod. Vďaka centrálnemu miestu na zhromažďovanie všetkých údajov môžu administrátori filtrovať a zobrazovať iba tie údaje, ktoré potrebujú. Napríklad je možné zobraziť údaje o spúšťaní spred troch spustení systému. Môže to tiež znamenať sekvenčné logovanie záznamov zo súvisiacich služieb a efektívnejšie sledovanie problémov s komunikáciou medzi nimi.

Vďaka binárnemu úložisku môžu byť údaje zobrazené v rôznych výstupných formátoch v závislosti od aktuálnych potrieb používateľa. Napríklad denný log je možné zobraziť v štandardnom formáte syslog. Ak však potrebujete sledovať trendy prerušenia služieb vo forme grafu, záznam môže byť exportovaný ako JSON objekt, vďaka čomu je s ním možné pracovať v grafických službách. Keď potrebujete zmeniť formáty v závislosti od situácie, nie je potrebná žiadna konverzia, pretože údaje sú binárne a nezapisujú sa na disk ako čistý text.

V závislosti od potrieb môžete implementovať systemd journal s existujúcim syslogom, alebo môže túto funkcionalitu nahradiť. Systemd môže dokonca dopĺňať existujúce mechanizmy logovania. Napríklad viacero služieb v jednom systéme môže mať svoje skompilované údaje prepojené v jednom systéme so systemd journalom.

Nastavenie systémového času

Systemd bude predvolene zobrazovať výsledky v lokálnom čase, čo je výhoda binárneho logovania journalu v tom, ako je možné prezerať záznamy logov. Prípadne ich možno zobraziť v UTC. Preto je dôležité uistiť sa, že časové pásmo je pred spustením logovania journalu správne nastavené. Na tento účel je systemd vybavený nástrojom s názvom timedatectl. Začneme tým, že zistíme, ktoré časové pásma sú k dispozícii na použitie, zobrazením zoznamu pomocou možnosti list-timezones:

Po nájdení časového pásma zodpovedajúceho umiestneniu vášho servera môžete časové pásmo nastaviť pomocou možnosti set-timezone:

Ak chcete otestovať a overiť, či sa časové pásmo teraz zobrazuje správne, môžete použiť príkaz timedatectl buď samostatne, alebo s pridaním „status“:

timedatectl status

Prvý riadok zobrazuje lokálny čas. Tento riadok by mal obsahovať správny čas pre váš miestny región.

Všeobecné prezeranie logov

Príkaz journalctl vám umožní zobraziť logy, ktoré zhromaždil démon journald. Keď použijete journalctl, každý záznam journalu zo systému sa zobrazí na obrazovke, pričom najstaršie záznamy sú uvedené navrchu. Úplný zoznam údajov však bude dlhý desiatky tisíc riadkov.

journalctl

Tí, ktorí používali štandardné zaznamenávanie syslog, budú formát považovať za známy, ale je dôležité mať na pamäti, že táto kompilácia údajov pochádza z mnohých zdrojov, na rozdiel od metódy syslog. Záznamy budú zahŕňať počiatočný proces zavádzania, initrd a jadro, ako aj štandardné chyby aplikácií.

Teraz, keď je nastavený lokálny čas, všetky záznamy budú začínať časovými pečiatkami v lokálnom čase, čo je k dispozícii pre každý záznam momentálne uložený v systéme, pričom celá logika sa zobrazuje pomocou týchto nových informácií. Nie ste však obmedzení len na lokálny čas. Pomocou príznaku –utc môžete zobraziť časové pečiatky aj v UTC:

Filtrovanie žurnálu podľa času

Mať k dispozícii toľko údajov je fantastické, ale prechádzať nimi a dokázať ich vstrebať, nehovoriac o ich mentálnom spracovaní, môže byť náročná úloha. S ohľadom na to sa dostávame k najdôležitejšej časti funkcie journalctl: filtrovaniu.

Zobrazenie záznamov z aktuálneho spustenia

Ak hľadáte údaje v žurnáli z posledného reštartu, môžete použiť funkciu journalctl s príznakom -b. Tým sa zobrazia všetky relevantné informácie zo záznamov z posledného reštartu vášho systému. Tento príkaz vám umožní nájsť a spravovať informácie, ktoré sú najrelevantnejšie pre aktuálne pracovné prostredie:

Ak sa používateľ rozhodne nehodnotiť každý jednotlivý záznam, journalctl zobrazí viac ako jeden deň spustení, ktoré sa v journalctl zobrazia s praktickými oddeľovačmi „Reboot“. To pomáha logicky oddeliť informácie z rôznych relácií spustenia na účely kontroly:

Informácie o predchádzajúcich spusteniach

Hoci zobrazovanie informácií o aktuálnom spustení býva najužitočnejšie, existujú situácie, kedy pomôžu aj informácie o predchádzajúcich spusteniach. Žurnál ukladá informácie o viacerých predchádzajúcich spusteniach, takže journalctl môže ľahko zobraziť informácie pre akékoľvek časové obdobie.

Certain distributions disable the saving of previous boot information, while others have it enabled by default. Enabling the persistent boot information can  be accomplished by creating a directory for storage of the journal by typing the following:

Prípadne môžete konfiguračný súbor žurnálu upraviť nasledujúcim spôsobom:

Nastavenie možnosti Storage= na „persistent“ v sekcii [Journal] povolí trvalé zaznamenávanie:

journalctl configuration

Po povolení tejto funkcie sprístupní journalctl určité príkazy, ktoré vám pomôžu označiť tieto spustenia ako jednotky delenia. Ak chcete zobraziť spustenia, ktoré boli zaznamenané v journald, môžete použiť možnosť –list-boots prostrednívom journalctl:

list boots journalctl

Ako je znázornené, každé spustenie bude uvedené na samostatnom riadku, pričom prvý stĺpec odráža predchádzajúce spustenia v poradí od najstaršieho po najnovšie. Ak je potrebná absolútnejšia referencia, druhý stĺpec obsahuje identifikáciu spustenia. Potom sú uvedené dve časové špecifikácie. Na zobrazenie informácií o žurnáli z konkrétneho spustenia možno použiť informácie z prvého alebo druhého stĺpca. Môžete napríklad použiť príznak -b s relatívnym ukazovateľom spustenia -1 na zobrazenie informácií o druhom najnovšom reštarte:

Podobne možno týmto spôsobom použiť aj ID spustenia z druhého stĺpca:

Časové okná

Zobrazenie spustení (boots) podľa ID je jednou z možností, ale často je užitočnejšie odkazovať sa na predchádzajúce spustenia pomocou časového okna v minulosti, ktoré nemusí nevyhnutne zodpovedať konkrétnym spusteniam. To je dôležité napríklad v situácii, keď pracujete s dlho bežiacimi servermi, ktoré sa nereštartujú často. Filtrovanie časových limitov je možné vykonať s ľubovoľnými časovými limitmi. Tým sa zobrazia iba informácie o reštartoch, ktoré spadajú do konkrétneho časového okna. Parametre tohto okna sú určené voľbami –since a –until. Pre časové voľby je k dispozícii niekoľko formátov. Formát absolútnej hodnoty času je nasledujúci:

Ak teda chcete zobraziť všetky spustenia od 10. januára 2015 o 17:15, zadajte nasledujúci príkaz:

Ak vynecháte ktorúkoľvek zo zložiek, použijú sa predvolené hodnoty. Okrem toho, ak vynecháte dátum, predvolí sa aktuálny dátum. Ak chýba časová zložka, predvolenou hodnotou je polnoc (00:00:00). Ak v časovej zložke vynecháte sekundy, predvolia sa na začiatok danej minúty (00):

Journal dokáže porozumieť skratkám súvisiacim s časom, ako napríklad „today“ (dnes), „tomorrow“ (zajtra), „yesterday“ (včera) a „now“ (teraz). Slová ako „ago“ (pred) v spojení s predradenými kvalifikátormi „-“ a „+“ možno použiť na vytvorenie príkazu podobného vete:

Ak ste boli upozornení na prerušenie služby, ktoré sa začalo o 9:00, a chcete skontrolovať záznamy v journale až do doby pred jednou hodinou, môžete tak urobiť pomocou nasledujúceho príkazu:

Ako vidno, definovanie flexibilného časového okna na zobrazenie požadovaných záznamov je veľmi jednoduché.

Filtrovanie podľa záujmu o správy

Okrem filtrovania journalu podľa časových obmedzení je možné údaje filtrovať aj na základe príslušného komponentu služby. Systemd poskytuje niekoľko spôsobov, ako to urobiť.

Podľa jednotky (Unit)

Pravdepodobne najužitočnejším parametrom filtrovania je filtrovanie podľa príslušnej jednotky (unit). Na filtrovanie podľa jednotky možno použiť voľbu -u. Ak chcete napríklad zobraziť všetky záznamy týkajúce sa jednotky Nginx, zadajte nasledujúci príkaz:

V reálnom svete by ste to chceli spojiť s časovým filtrom, aby sa zobrazili len zaujímavé riadky. Ak chcete skontrolovať vyššie uvedenú službu a to, ako fungovala dnes, môžete urobiť nasledujúce:

To je obzvlášť užitočné pri využití schopnosti journalu zhromažďovať záznamy z viacerých jednotiek, najmä tých, ktoré spolupracujú. Ak je proces Nginx pripojený k jednotke PHP-FPN na spracovanie dynamického obsahu, záznamy možno zlúčiť v chronologickom poradí zadaním oboch jednotiek:

To môže výrazne pomôcť pri sledovaní interakcie programov a uľahčiť ladenie systémov namiesto jednotlivých procesov.

Podľa ID skupiny, procesu alebo používateľa

Mnohé služby spúšťajú množstvo podprocesov (dcérskych procesov) na vykonanie konkrétnej práce. Ak je k dispozícii ID konkrétneho procesu, možno ho filtrovať aj zadaním poľa _PID. Ak je hľadané PID 8088, môžete urobiť nasledujúce:

Možno budete chcieť zobraziť aj záznamy zapísané od konkrétnej skupiny alebo konkrétneho používateľa. To sa dá dosiahnuť pomocou filtrov _GID a _UID. Ak webový server beží pod používateľom www-data, pomocou nasledujúceho príkazu môžete nájsť potrebné ID:

find id

Pomocou tohto ID potom môžete zobraziť príslušné výsledky z journalu:

Systemd sprístupňuje mnoho polí na účely filtrovania. Niektoré polia aplikuje journald na základe informácií zhromaždených zo systému v čase zaznamenávania, zatiaľ čo iné sú odovzdávané z procesu, ktorý sa práve zaznamenáva.

Predradený kvalifikátor _PID indikuje, že informácie boli zhromaždené zo systému v čase zaznamenávania. Journal automaticky zaznamenáva a indexuje PID počas procesu logovania, aby bola možnosť filtrovania neskôr k dispozícii. Ak chcete zistiť informácie o dostupných poliach journalu, môžete zadať:

Niektorým z nich sa budeme venovať neskôr v tejto príručke, ale nateraz sa dotkneme niektorých ďalších užitočných možností týkajúcich sa týchto polí. Ak chcete zobraziť všetky dostupné hodnoty pre konkrétne pole journalu, môžete použiť voľbu -F. Ak chcete zistiť, aké ID skupín má systemd journal, môžete vykonať nasledujúce:

possible gid Journalctl

To môže pomôcť pri vytváraní filtrov poskytnutím úplného zoznamu hodnôt, ktoré má pole ID skupiny v journale uložené.

Podľa cesty ku komponentu

Filtrovanie je možné vykonať aj zadaním umiestnenia cesty. Ak cesta vedie k spustiteľnému súboru, v journalctl sa zobrazia záznamy, ktoré sa tohto spustiteľného súboru týkajú. Ak je hľadaným spustiteľným súborom „bash“, môžete zadať:

Aj keď to niekedy nie je možné, ak je k dispozícii unit spustiteľného súboru, môže to poskytnúť prehľadnejší a informatívnejší spôsob filtrovania.

Zobrazenie správ jadra

Správy jadra, ktoré sa zvyčajne nachádzajú vo výstupe dmesg, je možné získať aj z journalu. Aby sa zobrazovali iba tieto správy, použijeme ako súčasť nášho príkazu príznaky -k alebo -dmesg:

Predvolene sa zobrazia správy z aktuálneho spustenia, ale predchádzajúce spustenia je možné špecifikovať pomocou predtým spomínaného príznaku výberu. Ak hľadáte správy spred piatich spustení, zadaním tohto príkazu získate potrebné výsledky:

Podľa priority

Systémoví administrátori často uprednostňujú filtrovanie podľa priority. Záznamy s nízkou prioritou, hoci sú často užitočné na prezeranie, môžu byť mätúce a obsahovať veľa rušivých prvkov, čo sťažuje ich analýzu. Použitie voľby -p v journalctl zobrazí iba správy so špecifikovanou prioritou a ostatné priority odfiltruje. Ak chcete zobraziť záznamy od úrovne error alebo vyššej, zadajte nasledujúce:

Tento príkaz vráti všetky správy označené ako error, alert, emergency alebo critical, pričom journal používa štandardné úrovne správ syslogu. Úrovne priority sú definované podľa číselnej hodnoty, zoradené od najvyššej po najnižšiu:

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

Ktorúkoľvek z vyššie uvedených možností je možné zamieňať s voľbou -p. Výberom ktorejkoľvek z priorít, ako je uvedené vyššie, sa odfiltrujú všetky priority na danej úrovni a vyššie.

Úprava zobrazenia v journale

Okrem použitia filtrovania na výber záznamov máme aj iné metódy úpravy výstupu, ktoré prispôsobujú zobrazenie journalctl našim potrebám.

Skrátenie/rozbalenie výstupu

Zobrazenie nášho výstupu môžeme upraviť nastavením toho, či journalctl údaje zmenší alebo rozbalí. Predvoleným nastavením journalctl je zobrazenie celého záznamu, pričom dlhšie záznamy presahujú doprava mimo obrazovky. Celé záznamy si môžete prezrieť posúvaním pomocou klávesu so šípkou doprava. Používateľ môže namiesto toho chcieť výstup skrátiť, pričom na riadkoch, ktoré by inak presahovali obrazovku, sa zobrazia tri bodky. Na tento účel je možné použiť voľbu –no-full:

no full option Journalctl

Prípadne môžete tiež povoliť zobrazenie všetkého bez ohľadu na dĺžku alebo prítomnosť netlačiteľných znakov pomocou príznaku -a:

Výstup na štandardný výstup

Journalctl predvolene zobrazuje výstup v pagery (stránkovači), ale ak chcete s údajmi manipulovať pomocou nástrojov na úpravu textu, pravdepodobne budete potrebovať, aby sa výstup generoval do štandardného výstupu. Môžete to dosiahnuť pomocou možnosti –no-pager:

V závislosti od potrieb používateľa to môže byť presmerované do súboru na disku alebo do spracovateľského nástroja.

Formáty výstupu

Údaje sa vždy ľahšie analyzujú, keď sú prezentované v lepšie zrozumiteľnom formáte. Journal poskytuje viacero možností zobrazenia pomocou parametra -o, za ktorým nasleduje konkrétne určený formát.

Ak chcete exportovať záznamy journalu do formátu JSON, môžete tak urobiť nasledujúcim spôsobom:

service logs in json

Táto stratégia je obzvlášť užitočná pre analytické nástroje. Formát json-pretty môže lepšie zobraziť dátové štruktúry predtým, ako ich odovzdáte spracovateľovi JSON:

output format json pretty Journalctl

Na zobrazenie môžete využiť niekoľko formátov:

  • cat: Zobrazuje iba samotné pole správy (message).
  • export: Binárny formát vhodný na prenos alebo zálohovanie.
  • json: Štandardný JSON s jedným záznamom na riadok.
  • json-pretty: JSON formátovaný pre lepšiu čitateľnosť pre ľudí
  • json-sse: Výstup vo formáte JSON zabalený tak, aby bol kompatibilný so server-sent events (udalosťami odosielanými serverom)
  • short: Predvolený výstup v štýle syslog
  • short-iso: Predvolený formát rozšírený o zobrazenie časových pečiatok v reálnom čase podľa ISO 8601.
  • short-monotonic: Predvolený formát s monotónnymi časovými pečiatkami.
  • short-precise: Predvolený formát s presnosťou na mikrosekundy
  • verbose: Zobrazuje každé dostupné pole journalu pre daný záznam, vrátane tých, ktoré sú zvyčajne interne skryté.

Vyššie uvedené možnosti umožňujú zobraziť journal vo vašom preferovanom formáte.

Aktívne monitorovanie procesov

Journal umožňuje prístup k funkciám monitorovania aktívnej alebo nedávnej aktivity bez toho, aby ste museli použiť iný nástroj. Môžete to urobiť pomocou príkazu journalctl s funkciou „tail“.

  • Zobrazenie nedávnych záznamov

Použitie možnosti -n (ktorá funguje rovnako ako príkaz tail -n) umožní zobrazenie určitého počtu záznamov:

Počet záznamov, ktoré chcete zobraziť, môžete špecifikovať konkrétnym číslom za parametrom -n:

  • Sledovanie záznamov v reálnom čase

Záznamy môžete tiež aktívne sledovať počas ich zápisu do systému pomocou príznaku -f. Funguje to rovnako ako príkaz tail -f:

Údržba journalu

Záznamy zaberajú miesto. Stojí za to sa tým zaoberať, prípadne vymazať niektoré staršie záznamy, aby sa uvoľnilo miesto.

Zistenie aktuálneho využitia disku

Príznak –disk-usage môže pomôcť zistiť, koľko miesta na disku momentálne zaberajú záznamy:

disk usage Journalctl

Mazanie starých záznamov

Od verzie systemd 218 (a nasledujúcich verzií) môžete journal zmenšiť dvoma rôznymi spôsobmi. Jedným z nich je možnosť –vacuum-size. Táto možnosť dokáže zmenšiť journal určením jeho veľkosti. Inými slovami, staršie záznamy sa budú z logu odstraňovať dovtedy, kým obsadené miesto nedosiahne požadovaný parameter:

Možnosť –vacuum-time dokáže zmenšiť priestor obsadený journalom určením hraničného času, pričom všetky záznamy staršie ako tento čas budú vymazané a tie, ktoré vznikli po zadanom čase, budú zachované. Ak si chcete ponechať záznamy len za posledný kalendárny rok, môžete použiť:

Obmedzenie rastu journalu

Môžete tiež obmedziť množstvo miesta, ktoré bude journal zaberať. To sa dosiahne úpravou súboru /etc/systemd.journald.conf. Rast journalu je možné obmedziť použitím ktorejkoľvek z nasledujúcich metód:

  • SystemMaxUse=: Určuje maximálny priestor na disku, ktorý môže journal využívať v trvalom úložisku.
  • SystemKeepFree=: Určuje, koľko miesta by malo zostať voľného pri pridávaní entít journalu do trvalého úložiska.
  • SystemMaxFileSize=: Určuje, do akej veľkosti môžu rásť súbory žurnálu, kým dôjde k ich rotácii v trvalom úložisku.
  • RuntimeMaxUse=: Určuje, koľko miesta na disku je povolené použiť v nestálom úložisku (v rámci súborového systému /run).
  • RuntimeKeepFree=: Pri zápise dát do nestáleho úložiska táto funkcia označuje množstvo miesta, ktoré musí byť vyhradené pre iné účely (v rámci súborového systému /run).
  • RuntimeMaxFileSize=: Označuje, koľko miesta môže jednotlivý žurnál záznamov zaberať v nestálom úložisku (v rámci súborového systému /run), kým ho bude potrebné pomerne upraviť.

Všetky tieto možnosti môžu pomôcť kontrolovať spotrebu úložiska žurnálom. Dôležitým faktom, ktorý treba poznamenať, je, že možnosti SystemMaxFileSize a RuntimeMaxFileSize sa budú zameriavať na archivované súbory, aby dosiahli stanovené limity. Toto je dôležitý fakt, ktorý treba mať na pamäti pri interpretácii počtu súborov po operáciách čistenia (vacuuming).

Záver

Je zrejmé, že žurnál systemd je neuveriteľne užitočný nástroj, pričom väčšina jeho výhod vyplýva z centralizovanej povahy logov’ a rozsiahleho objemu zaznamenaných metadát. Rozsiahle funkcie žurnálu možno využiť pomocou príkazu journalctl, čo uľahčuje vykonávanie relačného ladenia komponentov aplikácií, ako aj rozsiahlu analýzu systému.

Príjemnú prácu s počítačom!

author

Akshay Nagpal

Autor · CloudSigma

Preslav Dobrev je kreatívny dizajnér v spoločnosti CloudSigma, ktorý sa zameriava na konzistentnú firemnú identitu prostredníctvom tradičných a inovatívnych marketingových kanálov. Dokáže brilantne spájať umeleckú víziu so strategickým marketingom, čím vytvára pôsobivé príbehy značky.

Komentáre

Zatiaľ žiadne komentáre. Buďte prvý.