Starý logovací systém je pryč. Je to dobrá zpráva? Po instalaci operačního systému OpenSuse Tumbleweed jsem chtěl zkontrolovat logy. Standardně byly systémové logy umístěny v adresáři /var/log/, konkrétně v souborech messages..., firewall..., mail... apod. Jednalo se o jednoduchý systém logování, který jsem obdivoval, soubory bylo možno grepovat, prohlížet, editovat, mazat, protože se ukládaly po předem stanovených velikostech.
Tento návod platí pro OpenSuse Tumbleweed, ale pravděpodobně bude platit i pro jiné linuxové systémy.
Ale nebyli by to mimozemští vývojáři Linuxu, kdyby se nesnažili svým sporadickým uživatelům nějak pomáhat. Uživatel, který byl dlouhé roky zvyklý na určitý způsob sledování a vyhodnocování logů, a podotýkám, že některé mnou připravené bashe fungují na tom, že grepují a vyhodnocují zprávy z logu "messages", má nyní velký problém. Kouká do prázdného adresáře /var/log/ a neví, co si má o těch ufounech tvořících Linux, myslet. Jsou normální nebo jsou to dementi? Proč proboha "vylepšují" něco, co funguje??? Kdyby se radši zaměřili na to proč ta jejich slavná KDE plazma padá s frekvencí pět pádů za den!!! A nebo proč v KDE plazmě nejsou šetřiče obrazovky a uživatel si musí stáhnout xscreensaver + screensavery (šetřiče) a následně spustit a nastavit xscreensaver-demo!!! A to kdo ví, jestli tohle je konec nastavení šetřiče, protože se může kdovíco přihodit a nikdo kromě ufounů neví, co!
Ale zpět k novému systému logování.
Takže, naši přátelé neznámí a neidentifikovatelní linuxfouni zavedli nový způsob logování, který nazývají pro ufouny srozumitelným názvem Journalctl. Teoreticky bych si odvodil, že Journal = Zápisník a ctl = CONTROL. Ale je samozřejmě ve hvězdách, co tímto linuxfouni sledovali. Každopádně v adresáři /var/log nenajdeme nic a uživatel v tu ránu googluje jako divý a zjišťuje, s čím ho Linux opět vypekl.
Journalctl je tedy nástroj, který má na starosti práci s logy, které generuje démon systemd. "systemd je démon, který spravuje ostatní démony", zní oficiální definice na wikipedii. Já bych to definoval jinak. Je to služba, kterou vyvinul nějakej harry potter, kterej si o sobě myslí, že je pán bůh, a do všeho se, s prominutím, sere. Journalctl spravuje logy, které tento srací démon a jeho přidružení démoni vyblijí.
Journalctl a konzole
Nyní bude následovat doslova smršť variací příkazů v konzoli. Doufám, že vydržíte :-).
Journalctl se primárně ovládá v konzoli. Pokud napíšete příkaz
journalctltak obdržíte výpis událostí přímo do konzole, což je opravu žúžo labůžo.
Pro některé uživatele může být lepší přesměrovat výpis přímo do souboru takto:
journalctl --no-pager > journalctl.txtA pro ty největší fajnšmekry (jako jsem já) může být výhodné výpis dostat nejen do souboru, ale hlavně do nějakého editoru (kwrite) takto:
journalctl --no-pager > journalctl.txt; kwrite journalctl.txtAle pro ty úplně nejlepší fajnšmekry existuje superdlouhý příkaz, kterým si nejen zobrazíme log v kwrite, ale zobrazíme si tam jen něco z logu, co chceme my na základě příkazu grep takto:
journalctl --no-pager > /var/log/journalctl.txt; grep -i 'kernel' /var/log/journalctl.txt > /var/log/journalctl_kernel.txt; kwrite /var/log/journalctl_kernel.txtJak vidíte, tu hlavní krásu linuxu nám démoni potteři zatím nevzali. Nádherná variabilita příkazů v konzoli, kterou překonáme všechny potterovské nástrahy.
Nastavení časové zónyHlavní výhodou nástroje Journalctl je pracovat "nad daty", "nad logem". Můžete si např. nastavit zobrazení logů v jiném časovém pásmu, což se může hodit.
Nejprve zjistíte zkratky pro časové zóny takto:
timedatectl list-timezonesNo... je jich opravdu spousta, že?
Následně si nastavíme novou časovou zónu (např. UTC) pouze pro nástroj Journalctl:
sudo timedatectl set-timezone UTCA ověříme:
timedatectl status
Zobrazí se něco takového:
Local time: Sun 2017-07-02 11:16:06 CEST
Universal time: Sun 2017-07-02 09:16:06 UTC
RTC time: Sun 2017-07-02 09:16:06
Time zone: Europe/Prague (CEST, +0200)
Network time on: yes
NTP synchronized: yes
RTC in local TZ: no
Hned první řádka nás informuje o aktuálně nastaveném času pro ctl.
Základní prohlížení loguzákladním příkazem je tedy:
journactlJeho možné rozšíření linuxovými příkazy jsme si ukázali úvodem.
Časová razítka v UTC formátu takto:
journalctl --utcLog od posledního restartu/startu pc zobrazíme:
journalctl -bVýpis všech startů systému, které jsou v logu:
journalctl --list-bootsVýpis logu z posledně nabootovaného systému (-1):
journalctl -b -1Výpis konkrétního bootu (číslo je z journalctl --list-boots):
journalctl -b 509fc71184a943fea14e5a106f262683Výpis logu podle data a času (YYYY-MM-DD HH:mm:ss):
journalctl --since "2017-07-02 11:15:00"journalctl --since "2017-07-02 11:15:00" --until "2017-12-02 11:15:00"journalctl --since yesterdayVelmi užitečné je mít výpis konkrétní služby, jak fungovala - např. antivir:
journalctl -u apparmor.service
nebo kombinace:
journalctl -u apparmor.service --since today
Přehled o antiviru a discích zároveň:
journalctl -u apparmor.service -u udisks2.service --since yesterdaySeznam služeb získáme příkazem:
service --status-allPodle PID procesu:
journalctl _PID=9937Podle uživatele:
d -u Uzivatel
1000
journalctl _UID=1000 --since todayVýpis všech logovaných uživatelů a skupin takto:
journalctl -F _UID
journalctl -F _GIDKernel zprávy (alternativa ke grepu viz úvod):
journalctl -kA Kernel zprávy od předchozího bootu:
journalctl -k -b -1A zprávy podle priority (vždy od zadané k nejvyšším)journalctl -p err -bKódy priorit:
0: emerg
1: alert
2: crit
3: err
4: warning
5: notice
6: info
7: debug
Výpis bez stránkování (vhodné pro výstup do souboru):
journalctl --no-pagerOmezení na počet záznamů:
journalctl -n 20Průběžný log do konzole:
journalctl -f
Kolik log zabírá místa na disku:
journalctl --disk-usage
Čistění logu:
Zkrácení velikosti o staré záznamy na stanovenou velikost:
sudo journalctl --vacuum-size=1G
Na poslední rok:
sudo journalctl --vacuum-time=1yearsNastavení parametrů logování:
/etc/systemd/journald.conf
- SystemMaxUse=: Specifies the maximum disk space that can be used by the journal in persistent storage.
- SystemKeepFree=: Specifies the amount of space that the journal should leave free when adding journal entries to persistent storage.
- SystemMaxFileSize=: Controls how large individual journal files can grow to in persistent storage before being rotated.
- RuntimeMaxUse=: Specifies the maximum disk space that can be used in volatile storage (within the /run filesystem).
- RuntimeKeepFree=: Specifies the amount of space to be set aside for other uses when writing data to volatile storage (within the /run filesystem).
- RuntimeMaxFileSize=: Specifies the amount of space that an individual journal file can take up in volatile storage (within the /run filesystem) before being rotated.
Status, stop, start, restart v konzoli
sudo systemctl status systemd-journald
sudo systemctl stop systemd-journald
sudo systemctl start systemd-journald
sudo systemctl restart systemd-journald
Bash - poslání logu do mailu
Například nás budou zajímat všechny statusy za posledních 7 dní:
0: emerg
1: alert
2: crit
journalctl -p crit --no-pager --since "7days ago" > /var/log/journalctlmail.txt
jako přílohu:
mail -S smtp=192.168.1.1 -a /var/log/journalctlmail.txt -s "Server II kriticky report" mail@mail.cz < /dev/null
nebo
jako tělo mailu:
mail -S smtp=192.168.1.1 -s 'Server II kriticky report' mail@mail.cz < /var/log/journalctlmail.txt
A toto je vhodné zaplánovat jako bash v cronu.
Zdroj:
názor a zkušenost autora
https://www.digitalocean.com/community/tutorials/how-to-use-journalctl-to-view-and-manipulate-systemd-logs