Skip to content

Journald – konec textových logů

Dnes se podíváme na základy používání journald, nástupce textových logů. Systemd je nový init systém nahrazující stávající systémy ve snaze o unifikaci initscriptů a celkově spouštění systému. To, jak se mu to (ne)daří, probírat nebudeme, podíváme se pouze na základy používání jedné jeho části. Tou částí je Journald, logger, který nahrazuje klasické logování systému, jehož logy většinou najdete ve /var/log. Journald si ukládá veškerá data v binárních souborech, nelze je tedy číst klasicky tak, jak jsme byli zvyklí např. u syslogu. Než začnete nadávat, že je to k ničemu, je potřeba říci, že výstup journalctl samozřejmě parsovat můžete podle potřeby, takže grepování se meze nekladou. Journalctl (ovládací příkaz journald) má v defaultu zapnutý paging, ale lze ho jednoduše nastavit, aby data sypal na stdout. Ono grepování, head-ování, tail-ování, sed-ování a nevím co ještě, je hezká věc, ale nakonec zjistíte, že s journalctl si ho „neužijete“ tolik, jako s původními textovými logy. Většinu práce za tyto programy přebírá právě journalctl. Dost bylo řečí, jdeme na pár příkladů:

základní výpis všeho, co se stalo od posledního bootu journalctl -xb

pokud nechceme, aby se nám výpis zastavil v pageru, například v more nebo less-u, přídáme volbu –no-pager

přehled všech bootů si zobrazíme pomocí –list-boots

logy z určitého období od-do si zobrazíme například pomocí journalctl –no-pager –since=-10d –until=-9d nebo např. journalctl –no-pager –since=yesterday

výpis logu, který se týká konkrétního uživatele journalctl -b –no-pager _UID=1000

Grep neumí dvě podmínky pro hledání ve smyslu to NEBO tohle, journalctl s tím nemá problém. Lze zapsat více _UID a pak je journalctl bere jako logické OR. Také je možno kombinovat různá pole, např. _UID a _HOSTNAME, pak je journalctl bere jako AND.

Takto vypadá například journalctl –list-boots:

-75 b0b528f9138e4726bd6f3cc34c9f7d89 So 2013-10-19 21:41:47 CEST—Ne 2013-10-20 07:26:41 CEST
-74 aac18d9c079d4625a547e412a7ceca37 Ne 2013-10-20 07:26:57 CEST—Ne 2013-10-20 08:46:50 CEST
-73 06755bea7a2248e8b727fce72144c081 Ne 2013-10-20 08:47:07 CEST—Pá 2013-10-25 11:35:36 CEST
-72 0273ba06d36c450b9cecce80d3589ba9 Pá 2013-10-25 11:52:37 CEST—Pá 2013-10-25 13:30:34 CEST
-71 57b6fb3e21514911a65f66324e9d9da2 Pá 2013-10-25 13:32:44 CEST—Ne 2013-10-27 12:01:01 CET
-70 b6a5d1e0fdd843bb90e1b23992a432ae Ne 2013-10-27 12:08:21 CET—Po 2013-10-28 13:01:01 CET

Pomocí journalctl -b 5732e3de5eb74350902c7c6514e27aa7 si vypíšete eventy pouze z doby tohoto bootu.

A co třeba logy pouze ze specifického programu? Grep … ne, ne … jinak:

journalctl -b -u postgresql
-- Logs begin at So 2013-10-19 21:41:47 CEST, end at So 2014-05-03 16:34:47 CEST. --
dub 29 15:50:50 jarvis systemd[1]: Starting PostgreSQL database server...
dub 29 15:50:50 jarvis pg_ctl[874]: LOG:  redirecting log output to logging collector process
dub 29 15:50:50 jarvis pg_ctl[874]: HINT:  Future log output will appear in directory "pg_log".
dub 29 15:50:51 jarvis systemd[1]: Started PostgreSQL database server.

A co třeba všechny eventy, vztahující se k disku sda?

journalctl /dev/sda

Pokud potřebujete opravdu kompletní přehled o konkrétním záznamu, stačí zvolit verbose:

journalctl -o verbose -xb -u dbus
-- Logs begin at So 2013-10-19 21:41:47 CEST, end at So 2014-05-03 17:26:47 CEST. --
Út 2014-04-29 15:50:49.603428 CEST [s=c29cc6ff31cc461b9e166e075f627ec7;i=eb852;b=841aca9e16164db08643f1afced2597d;m=5075d3;t=4f82eb8368128;x=ccd7422d952680fe]
    SYSLOG_FACILITY=3
    _MACHINE_ID=3eb0f3fc1b76497599bfef0b77ba2023
    _HOSTNAME=jarvis
    PRIORITY=6
    _UID=0
    _GID=0
    CODE_FILE=../src/core/unit.c
    CODE_LINE=1112
    CODE_FUNCTION=unit_status_log_starting_stopping_reloading
    SYSLOG_IDENTIFIER=systemd
    MESSAGE_ID=7d4958e842da4a758f6c1cdc7b36dcc5
    _TRANSPORT=journal
    _PID=1
    _COMM=systemd
    _EXE=/usr/lib/systemd/systemd
    _CAP_EFFECTIVE=1fffffffff
    _SYSTEMD_CGROUP=/
    UNIT=dbus.service
    _BOOT_ID=841aca9e16164db08643f1afced2597d
    _CMDLINE=/usr/lib/systemd/systemd --switched-root --system --deserialize 22
    MESSAGE=Starting D-Bus System Message Bus...
    _SOURCE_REALTIME_TIMESTAMP=1398779449603428
-- Subject: Unit dbus.service has begun with start-up
-- Defined-By: systemd
-- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
-- 
-- Unit dbus.service has begun starting up.

Journalctl vám předhodí svoje výsledky pěkně barevně, kde errory jsou červenou barvou. Pro rychlý přehled je to skvělé:
journald

A je to. Samozřejmě voleb a možností je více a lze je kombinovat, takže bych řekl, že journald/journalctl je velmi silný a zajímavý nástroj pro zkoumání logů. V současné době jsem si všiml bugu (již nahlášeného) v opensuse 13.1 a ve SLES(D)u 12, který brzy vyjde, že se logy z journald neuchovávají po rebootu, což je velice otravné. Je to dáno tím, že se logy ukládají místo do /var/log/journal do /var/run/log/journal, a tento adresář se po restartu čistí. V bugzille je to nahlášeno a mělo by dojít k nápravě, snad i v současné betě SLES/SLEDu.

Jen poslední poznámka. Systemd v posledních verzích v sobě obsahuje například i vlastní implementaci cronu, která by měla nahradit klasický cron. Bude tak možné snadněji zjišťovat, zda se naplánovaná úloha spustila, nespustila, proč se nespustila popř. s jakým výsledkem doběhla. Tak pak už asi zbývá implementovat snad jen vim a doktora z emacsu a bude z toho nový systém 🙂

Napsat komentář

Vaše emailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *

Time limit is exhausted. Please reload the CAPTCHA.