Logy a journald

journalctl, /var/log, co spadlo a proč.

Když něco spadne, nespustí se nebo se chová divně, odpověď je skoro vždycky v logu. Log je záznam toho, co systém a jeho služby dělaly — kdy se co stalo, jaká přišla chyba, proč se něco nepovedlo. První reflex sysadmina není přeinstalace ani restart naslepo, ale podívat se do logu. V moderním Linuxu jsou dva světy: journald (systemd, binární žurnál, čteš ho přes journalctl) a klasické textové logy v /var/log. Až se v obou naučíš hledat cíleně, přestaneš tápat.


Pár pojmů na úvod

  • Log = časová stopa událostí. Řádek s razítkem (timestamp), jménem služby, PID a zprávou. Když se chceš dozvědět „co se dělo v 14:32", jdeš sem.
  • journald = logovací služba systemd (systemd-journald). Sbírá zprávy ze všech služeb, kernelu i aplikací do jednoho binárního žurnálu. Nečteš ho textovým editorem — používáš journalctl.
  • journalctl = nástroj na čtení žurnálu. Filtruje podle služby, času, priority, bootu. Tvůj hlavní nástroj v téhle kapitole.
  • /var/log = klasické textové logy. Soubory jako /var/log/messages, /var/log/secure, a logy jednotlivých aplikací (/var/log/nginx/, /var/log/httpd/…). Čteš je běžnými nástroji (less, grep, tail).
  • Priorita = jak vážná zpráva je — od emerg (systém umírá) po debug (detailní ladění). Podle ní se dá filtrovat, ať vidíš jen to důležité.
  • Perzistence = jestli žurnál přežije reboot. Volatile = jen v RAM (po restartu pryč), persistent = uložený na disku v /var/log/journal.

Proč logy: první reflex, ne poslední

Přijdeš k tomu, že web neběží, služba se nespustila, nebo se něco záhadně restartuje. Máš dvě možnosti:

  1. Hádat a zkoušet — restartovat, přeinstalovat, měnit náhodně konfiguraci. Windows reflex. Většinou nic nevyřeší a jen zameteš stopy.
  2. Přečíst si log — otevřít žurnál dané služby, najít chybovou hlášku a timestamp. Odpověď tam skoro vždycky je: „port už používá jiný proces", „chybí soubor", „špatné heslo k databázi".

Sysadmin dělá to druhé. Log ti řekne proč to spadlo — a bez „proč" opravuješ naslepo. Cílem téhle kapitoly je, aby ses při každém problému nejdřív zeptal: „co je v logu?"


Dva světy logů

journald — binární žurnál systemd

Většina moderních služeb (všechno, co běží pod systemd) loguje do journaldu. Není to textový soubor — je to strukturovaný binární žurnál, ke kterému se dostaneš přes journalctl. Výhoda: každá zpráva má metadata (která služba, jaký PID, jaká priorita, přesný čas), takže se dá přesně filtrovat.

journalctl                 # celý žurnál (od nejstaršího), otevře se v less
journalctl -e              # skoč rovnou na konec (nejnovější zprávy)
journalctl -n 50           # posledních 50 řádků

/var/log — klasické textové soubory

Vedle toho pořád existují textové logy v /var/log. Některé aplikace (nginx, Apache, PostgreSQL…) si logují po svém do vlastních souborů, nezávisle na journaldu. A tradiční systémové logy:

ls /var/log                       # co všechno se tu loguje
less /var/log/messages            # obecné systémové zprávy (na Fedoře/RHEL)
less /var/log/secure              # přihlášení, sudo, SSH, auth (RHEL/Fedora)
sudo less /var/log/nginx/error.log   # chyby konkrétní aplikace

💡 Na Debianu/Ubuntu se tradiční logy jmenují jinak — /var/log/syslog místo messages, /var/log/auth.log místo secure. Koncept je stejný, jen jiná jména.

Klíčové zjištění: když appka loguje do journaldu, hledat v /var/log je marné — a naopak. Vždy si napřed ujasni, kam daná služba loguje. Nová služba pod systemd → skoro jistě journald. Klasický webserver nebo databáze → často vlastní soubor v /var/log.


journalctl prakticky

Tady je jádro celé kapitoly. Tyhle přepínače používáš pořád.

Jen jedna služba: -u

Nejdůležitější přepínač. Bez něj se v žurnálu utopíš — vidíš zprávy ze všeho najednou.

journalctl -u nginx              # jen služba nginx
journalctl -u sshd               # jen SSH démon
journalctl -u nginx -n 100       # posledních 100 řádků nginx

Sleduj živě: -f

Jako tail -f — necháš okno otevřené a díváš se, jak zprávy přibývají v reálném čase. Ideální, když zkoušíš reprodukovat problém: spustíš -f, provedeš akci, koukáš, co se objeví.

journalctl -f                    # sleduj celý žurnál živě
journalctl -u nginx -f           # sleduj živě jen nginx

Podle bootu: -b

-b = jen tento boot (od posledního startu). -b -1 = minulý boot. Skvělé, když se ptáš „co se dělo, než to spadlo a restartovalo se".

journalctl -b                    # od posledního startu systému
journalctl -b -1                 # předchozí boot (co bylo před restartem)
journalctl --list-boots          # seznam všech bootů, které žurnál pamatuje

Podle priority: -p

Filtruj podle vážnosti. -p err = chyby a horší (error, critical, alert, emerg). Odfiltruje ti šum a necháš jen to, co bolí.

journalctl -p err                # jen chyby a horší
journalctl -p warning            # varování a horší
journalctl -u nginx -p err       # chyby konkrétní služby

Podle času: --since / --until

journalctl --since "10 min ago"          # posledních 10 minut
journalctl --since today                 # od půlnoci
journalctl --since "2026-07-12 14:00"    # od konkrétního času
journalctl --since "1 hour ago" --until "30 min ago"   # časové okno

Kombo na incident

Přepínače se skládají. Když ladíš konkrétní průšvih, kombinuj službu + čas + prioritu:

journalctl -u nginx -b --since "1 hour ago" -p warning

Přeloženo: ukaž mi ze služby nginx, jen z tohohle bootu, jen za poslední hodinu, jen varování a horší. Z tisíců řádků zbyde pár, které opravdu čteš. Tohle je rozdíl mezi „hledám hodinu" a „našel jsem za 30 sekund".


Perzistence: přežije žurnál reboot?

Dřív býval žurnál často volatile — žil jen v RAM (/run/log/journal) a po rebootu byl pryč. Dnes je ale výchozí Storage=auto: pokud složka /var/log/journal existuje (moderní distra — Fedora, Debian 12, novější Ubuntu — ji mají out-of-the-box), je žurnál persistent. Ověř si to příkazem journalctl --list-boots: když vidíš jen boot 0, jsi na volatile a pomůže návod níž. Volatile je totiž pekelně nepříjemné: stroj spadl, restartoval se, a historie zmizela s restartem.

Zapnutí persistent žurnálu = stačí vytvořit adresář:

sudo mkdir -p /var/log/journal
sudo systemd-tmpfiles --create --prefix /var/log/journal   # nastaví práva
sudo systemctl restart systemd-journald

Od té chvíle se žurnál ukládá na disk a journalctl -b -1 (minulý boot) skutečně něco vrátí. Ověříš:

journalctl --list-boots          # když je persistent, uvidíš víc než jeden boot

🚩 Volatile žurnál je klasická past: řešíš, proč se server v noci restartoval, ale žurnál z té doby neexistuje, protože nebyl perzistentní. Na produkčním stroji chceš vždy persistent.


Rotace a velikost: ať ti logy nesežerou disk

Žurnál i textové logy rostou. Když se o to nikdo nestará, můžou zaplnit disk — a plný disk je sám o sobě zdroj dalších pádů (služby nemůžou zapisovat). Kolik místa žurnál zabírá:

journalctl --disk-usage          # kolik místa žere žurnál

Uklidit ho můžeš podle velikosti nebo stáří:

sudo journalctl --vacuum-size=500M    # nech maximálně 500 MB, zbytek smaž
sudo journalctl --vacuum-time=2weeks  # smaž vše starší než 2 týdny

Natrvalo se limity nastavují v /etc/systemd/journald.conf (např. SystemMaxUse=500M). Textové logy v /var/log řeší nástroj logrotate — automaticky je krájí, komprimuje (.gz) a maže staré. Proto v /var/log vidíš soubory jako messages-20260701.gz.


Priority: od emerg po debug

Každá zpráva má prioritu (severity). Od nejvážnější po nejmíň:

PrioritaČísloCo to znamená
emerg0systém je nepoužitelný
alert1okamžitá akce nutná
crit2kritická chyba
err3běžná chyba
warning4varování, ještě to jede
notice5normální, ale významná událost
info6běžná informační zpráva
debug7detaily na ladění

Když dáš -p err, dostaneš prioritu 3 a horší (tedy 0–3). Čím níž na tabulce jdeš, tím víc šumu — -p debug ti vysype úplně všechno. Praktický postup: začni od -p err, a když nic, povol -p warning a -p info.


Correlation: propojit stopy přes službu, PID a čas

Skutečný problém se málokdy pozná z jednoho řádku. Umění je propojit zprávy do příběhu:

  • Přes službu (-u) — vidíš celou linku jedné služby: nastartovala, běžela, dostala chybu, spadla.
  • Přes čas (--since/--until) — co se dělo ve stejnou chvíli v jiných službách? Často jedna věc shodí druhou (databáze umřela → aplikace hlásí chyby o vteřinu později).
  • Přes PID — když víš číslo procesu, dohledáš jen jeho zprávy:
journalctl _PID=1234             # jen zprávy procesu s PID 1234
journalctl _UID=1000             # jen zprávy konkrétního uživatele

Typický postup u „služba se nespustila": journalctl -u sluzba -e → najdeš chybovou hlášku a její timestamp → přepneš na --since kolem toho času bez -u → zjistíš, co jiného se ve stejnou chvíli dělo.


Co v logu vlastně hledat

Když otevřeš žurnál, nečti ho odshora dolů celý. Hledej cíleně:

  • Chybovou hlášku — slova jako error, failed, refused, denied, cannot, timeout.
  • Timestamp — kdy se to stalo. Sedí to s dobou, kdy uživatel hlásil problém? Sedí to s restartem?
  • „Proč se to nespustilo" — u služby hledej řádky kolem Failed to start / Main process exited. Systemd tam většinou napíše i důvod (exit code, „address already in use", „permission denied").
journalctl -u nginx -p err -e            # rovnou na konec, jen chyby nginx
journalctl -u nginx | grep -i "address"  # hledej konkrétní frázi

Failure modes — jak si to zbytečně ztížíš

  • Hledání naslepo bez -u a --since. Pustíš holé journalctl a topíš se v tisících řádků ze všech služeb. Vždy zúž na službu a čas — jinak hledáš jehlu v kupce sena, kterou sám sypeš.
  • Žurnál není perzistentní. Řešíš noční pád, ale journalctl -b -1 nic nevrátí, protože žurnál žil jen v RAM a s restartem zmizel. Na produkci zapni /var/log/journal.
  • Plný disk od logů. Nikdo nehlídal velikost, žurnál nebo /var/log nabobtnal a zaplnil disk — a plný disk shodí další služby. Hlídej journalctl --disk-usage a df -h, nastav limity.
  • Čteš /var/log, když appka loguje do journaldu (a naopak). Půl hodiny grepuješ prázdný soubor, protože zprávy jsou úplně jinde. Napřed zjisti, kam služba loguje.

🛠️ Cvičení

  1. Jen jedna služba. Vyber si nějakou běžící službu (třeba sshd nebo NetworkManager) a vypiš jen její posledních 30 řádků žurnálu. Jaký přepínač omezí výstup na jednu službu a jaký na počet řádků?
  2. Co se dělo teď. Vypiš jen chyby (a horší) za posledních 10 minut ze všech služeb. Poskládej dva přepínače: priorita + čas. Kolik řádků ti zbylo oproti holému journalctl?
  3. Přežil žurnál reboot? Zjisti, jestli máš perzistentní žurnál. (Nápověda: journalctl --list-boots a existence /var/log/journal.) Kdyby ne, jak bys ho zapnul a proč je to na serveru důležité?
  4. Kolik místa a jak uklidit. Zjisti, kolik místa žurnál zabírá, a napiš (nespouštěj naslepo!) příkaz, který by nechal jen posledních 200 MB. Kde by se dal limit nastavit natrvalo?
  5. Kam appka loguje. Najdi jednu službu, která loguje do journaldu, a jednu, která si píše do vlastního souboru v /var/log. Jak poznáš rozdíl a proč je to důležité vědět dřív, než začneš hledat?
Náčrt řešení — rozbal, až si cvičení zkusíš sám
  1. Jedna službajournalctl -u sshd -n 30. -u <služba> omezí výstup na danou systemd jednotku, -n 30 na posledních 30 řádků. Bez -u bys viděl zprávy ze všeho a musel je pracně filtrovat. Pozor: jméno za -u musí sedět s názvem jednotky (systemctl status ti ho ukáže) — nginx, ne Nginx.
  2. Chyby za 10 minutjournalctl -p err --since "10 min ago". -p err nechá jen prioritu 3 a horší, --since zúží časové okno. Proti holému journalctl (klidně desítky tisíc řádků) ti typicky zbyde pár řádků, které opravdu přečteš. Pozor: -p err znamená „error a horší", ne jen přesně error.
  3. Perzistencejournalctl --list-boots: když vidíš víc bootů než jen 0, žurnál je perzistentní. Zapneš ho vytvořením /var/log/journal (sudo mkdir -p /var/log/journalsudo systemctl restart systemd-journald). Na serveru je to zásadní, protože po pádu a restartu chceš vidět, co se dělo před restartem — volatile žurnál to s rebootem smaže. Pozor: bez perzistence ti -b -1 (minulý boot) nevrátí nic.
  4. Místo a úklid — velikost: journalctl --disk-usage. Úklid na 200 MB: sudo journalctl --vacuum-size=200M. Natrvalo se limit nastaví v /etc/systemd/journald.conf klíčem SystemMaxUse=200M. Pozor: --vacuum-* maže nevratně nejstarší zprávy — na produkci si rozmysli, kolik historie potřebuješ.
  5. Kam loguje — služba pod systemd (např. sshd, NetworkManager) → journalctl -u <služba> něco vrátí, tam loguje do journaldu. Webserver/databáze (nginx, PostgreSQL) si často píše do vlastního souboru (/var/log/nginx/error.log). Poznáš to tak, že v journaldu je ticho, ale soubor v /var/log roste. Pozor: hledat na špatném místě = půl hodiny grepuješ prázdno; napřed zjisti kam, pak hledej co.

🧠 Otázky & odpovědi

Jaký je rozdíl mezi journaldem a logy v /var/log

journald je logovací služba systemd — sbírá zprávy ze všech služeb i kernelu do jednoho binárního žurnálu, který čteš přes journalctl a umíš přesně filtrovat (podle služby, času, priority, bootu). /var/log jsou klasické textové soubory (messages, secure, logy aplikací jako nginx), které čteš běžnými nástroji (less, grep, tail). Moderní služby pod systemd logují do journaldu; některé aplikace si píšou po svém do /var/log. Klíč je vědět, kam daná služba loguje, než v ní začneš hledat.

Proč je při hledání v žurnálu tak důležitý přepínač -u

Protože bez něj vidíš zprávy ze všech služeb najednou — klidně desítky tisíc řádků, ve kterých se utopíš. -u <služba> omezí výstup na jednu systemd jednotku, takže sleduješ jen linku té věci, kterou řešíš: nastartovala, běžela, dostala chybu, spadla. Skoro vždy ho kombinuješ s časem (--since) a prioritou (-p err), a z kupy řádků zbyde pár, které opravdu přečteš. Rozdíl mezi „hledám hodinu" a „našel jsem za 30 sekund" je právě v tomhle zúžení.

Co znamená volatile vs persistent žurnál a proč mi na tom má záležet?

Volatile žurnál žije jen v RAM (/run/log/journal) a po rebootu zmizí. Persistent se ukládá na disk do /var/log/journal a reboot přežije (moderní distra ho mají zapnutý ve výchozím stavu). Záleží na tom, protože nejčastěji chceš log právě po pádu a restartu — abys zjistil, co se dělo, než to spadlo. U volatile žurnálu je jenže ta historie s restartem pryč a journalctl -b -1 (minulý boot) nic nevrátí. Persistent zapneš vytvořením adresáře /var/log/journal a restartem systemd-journald. Na produkčním serveru chceš vždycky persistent.

Jak najdu, proč se služba nespustila

Podívej se do žurnálu té služby a najdi konec: journalctl -u <služba> -e (nebo -p err, ať vidíš jen chyby). Systemd tam u neúspěšného startu napíše řádky jako Failed to start a Main process exited — a většinou i důvod: exit code, address already in use (port už někdo drží), permission denied (chybí práva), chybějící soubor. Poznamenej si timestamp té chyby a případně přepni na --since kolem toho času bez -u, ať vidíš, co jiného se ve stejnou chvíli dělo (třeba spadlá závislost). To je celý princip — najít chybovou hlášku a čas, ne hádat.

Jak zabráním tomu, aby mi logy zaplnily disk

Hlídej velikost a nastav limity. Kolik žurnál žere zjistíš journalctl --disk-usage, uklidíš sudo journalctl --vacuum-size=500M (nech 500 MB) nebo --vacuum-time=2weeks (smaž starší dva týdny). Natrvalo se limit nastaví v /etc/systemd/journald.conf (SystemMaxUse=500M). Textové logy v /var/log řeší logrotate, který je automaticky krájí, komprimuje a maže staré. Proč to řešit: plný disk sám o sobě shazuje další služby (nemůžou zapisovat), takže neuhlídané logy = zdroj nových pádů. Sleduj i celkový disk přes df -h.