Porozumění protokolům je důležité: pokud někdy spadnete na server, který má chybu nebo je hacknut, obvykle jediným způsobem, jak pochopit, co se stalo, je pomocí protokolů. Hlavní aplikací, kterou použijeme, je journalctl, odtud název článku. Poslouchejte tedy pozorně jako ve správný den, možná budete rádi, když víte, jak to funguje.
Kde jsou uloženy systemd protokoly? A v jakém formátu je uložen?
Budeme předpokládat, že máte normální systém, protože systemd lze přizpůsobit tak, aby byl na výjimečných místech. Také některé distribuce Linuxu, jako je Ubuntu 16.04 ve výchozím nastavení zakázáno trvalé protokolování, které systému systemd brání ve správné práci. Pokud máte takovou distribuci, upravte / etc / systemd / journald.conf soubor, změňte Storage = auto na Storage = persistent a nakonec restartujte.
Normálně tedy soubory systemd najdete v / var / log / journal. Systém žurnálování je sám o sobě službou zvanou system-journald.servis. Zkusme vypsat soubory v tomto adresáři:
# ls / var / log / journal / -R/ var / log / journal /:
15e43c1734090ac7fbea6b40fcd99d31
/ var / log / journal / 15e43c1734090ac7fbea6b40fcd99d31:
system @ a39da368947bd2ba-231f9bfc18a7a356.deník ~
system @ 62ac1299826d036cb043d6c06a9493b7-0000000000000001-00067d6410099a19.časopis
user-1000 @ b27e98812223a9bc-387e0521703f73d9.deník ~
user-1000 @ 2123bc076b58569fe1fb13e9dbc1b0e0-0000000000000001-0007fe36ac2810e0.časopis
uživatel-1000.časopis
[spousta dalších souborů, jako jsou ty výše ...]
Protože chci, abyste dál četli, musel jsem výstup zkrátit, protože obsahuje mnoho souborů (v mém příkladu více než 60 souborů), omlouvám se! Možná v pokušení otevřít jednu?
# head --bytes = 512 / var / log / journal / 15e43c1734090ac7fbea6b40fcd99d31 / [chráněno e-mailem]b58569fe1fb13e9dbc1b0e0-0000000000000001-0007fe36ac2810e0.časopis
?s, q?n / FLz???Ulz?l?]????
?_?b???z????Ó?y1KN ?i?eO??Ž?u? ?=?x0?L?d?7??X4n #?E? d3l?
p??o | MFO:?!qs?.tK??R?\??1?| 5 ????$?G??#?S??;??B7???????t???Y????mN?q????ZQ
?Yv?E?????BD?C?? wF??d |
?2?? 7???????[??Un?= 8????C?2 = str?&?" ?0
????*????_?? ???
5?????yk?G? ?6?|??u??w: # 12?Y??
3 TU;???''?jX??2?X'?=??[[chráněno e-mailem]
[chráněno e-mailem]?_?>??3S???,lR?.?$?G?L???s?/E??M1??q???
Hej, podívej, to opravdu nevypadá jako obvyklé log soubory, které vidíš správně? Nebojte se, tento soubor není poškozený, právě jste objevili aspekt systemd: systemd ukládá soubory v binárním formátu. Proto je to co nejmenší: strukturovaná data, jako je čas nebo umístění, jsou uložena přímo v binárním formátu, což obvykle trvá méně než bajty než text. Ale to není jediný důvod.
systemd neukládá pouze řádky protokolu. Jeho záměrem je usnadnit monitorování a průzkum protokolů. Abychom tomuto úkolu pomohli, jsou zprávy protokolu ve skutečnosti řádek textu doprovázený daty, jako je závažnost protokolu (varování, chyba atd.), nebo dokonce pole, která by byla užitečná pouze pro vaši aplikaci (například požadovaná adresa URL).
# journalctl --output = verbose - všePRIORITA = 6
_UID = 0
_GID = 0
_CAP_EFFECTIVE = 3fffffffff
_BOOT_ID = ee4cc2ce7e8273aaffb5fc59c873ce7b
_MACHINE_ID = bc422e0feaab64bb7dd218c24e6830e5
_HOSTNAME = linux
SYSLOG_FACILITY = 3
SYSLOG_IDENTIFIER = systemd
UNIT = dnf-makecache.servis
_TRANSPORT = deník
_PID = 1
_COMM = systemd
_EXE = / usr / lib / systemd / systemd
_CMDLINE = / usr / lib / systemd / systemd --switched-root --system --deserializovat 76
_SYSTEMD_CGROUP = / init.rozsah
_SYSTEMD_UNIT = init.rozsah
_SYSTEMD_SLICE =-.plátek
_SELINUX_CONTEXT = system_u: system_r: init_t: s0
CODE_FILE = src / core / job.C
CODE_LINE = 795
CODE_FUNCTION = job_log_status_message
MESSAGE_ID = a76e08846f5f0971371dbb11126e62e1
MESSAGE = Spuštěno dnf makecache.
# journalctl --catalog --lines = 3000 --pager-end "_TRANSPORT = jádro" VÝSLEDEK = hotovo
_SOURCE_REALTIME_TIMESTAMP = 1532886335471422
Řekl jsem vám, že je tu spousta polí (tady je 25 polí nebo 29 počítajících časových značek), veškerý výše uvedený úryvek je pouze pro jednu zprávu protokolu! Velkou výhodou je, že můžete spustit vyhledávání filtrováním libovolného pole v této zprávě protokolu. To opravdu umožňuje pokročilé filtrování.
Jedním z nejzřejmějších filtrů, které byste chtěli, je filtrování podle služby. Jak vidíte výše, existuje pole JEDNOTKA, takže můžete snadno filtrovat a získat pouze protokolové zprávy z jedné služby. O tom vám řeknu později.
Ale toto množství dat znamená také něco jiného: téměř ve všech případech nikdy neotevřete soubor protokolu ručně a nikdy se nedotknete složky / var / log / journal. Journalctl použijete pro jakoukoli úlohu související s protokolováním. Neexistuje žádná taková věc rotace protokolu, vše je spravováno časem protokolu.
Počet polí bude také záviset na tom, jak dobrá je integrace systemd do vaší aplikace. Čím více polí zpráva protokolu obsahuje, tím lepší je. U služeb základního systému se systemd již postaral o dobrou integraci, ale u jiných aplikací a služeb se kvalita integrace značně liší. Normálně by se to mělo časem zlepšit, jak si lidé zvyknou na systemd.
Dobře, teď je čas objevit funkce časopisu.
Nejpoužívanější příkazy pro journalctl
První příkaz, na který byste se měli podívat, je ten, který zobrazuje protokoly jádra Linuxu. Ano, systemd také zpracovává úložiště protokolů jádra, takže můžete získat i protokoly předchozích bot. Zde je příkaz:
# journalctl --catalog --lines = 3000 --pager-end "_TRANSPORT = jádro"Ukáže vám pager, kde můžete vidět poslední zprávy. Pomocí kláves se šipkami (↑ / ↓) nebo Page Up / Page Down můžete posouvat nahoru na posledních 3 000 řádků. Příznak -catalog instruuje journalctl, aby zobrazoval kontext kolem řádků protokolu, podobně jako restartování počítače nebo v jiných kontextech zastavení / spuštění služby. Vždy dávám tento příznak, protože vždy záleží na kontextu, pomáhá zjistit, v jaké situaci se řádek protokolu objevil, takže můžete hádat, proč jste dostali tento řádek protokolu.
Nyní možná chcete vidět pouze řádky protokolu z aktuálního bootování:
# journalctl --catalog --lines = 35000 --pager-end --boot "_TRANSPORT = jádro"Všimněte si, že argument příkazového řádku -boot funguje ve všech situacích, nejen s protokoly jádra. Pokud dáváte přednost začátku od začátku:
# journalctl --catalog --boot "_TRANSPORT = jádro"Nevím, jestli je to váš případ, ale mám dost jaderných protokolů! A co mít obecný přehled o vašem stroji?
# journalctl --catalog --lines = 3000 --pager-endPáni, ve vašem systému se děje spousta věcí! Trochu filtrování by zde bylo užitečné. Jedním z nejpoužívanějších filtrů je shoda s konkrétní službou (jako je váš server SSH nebo server HTTP), název systémové jednotky pro službu SSH je sshd.služba, takže:
# journalctl --catalog --lines = 3000 --pager-end --unit = sshd.servisTo je skvělé, že?? Je použitelný, pouze pokud znáte název služby - ale v mnoha případech neznáte název této služby. Pokud se nacházíte v takové situaci, můžete potřebovat seznam služeb, jejich popisy a stav:
# systemctl list-units --type = serviceDobře, tento problém je nyní vyřešen. Někdy se však zobrazí chybová zpráva, kterou dostanete z externího systému, jako je váš vlastní web, nebo z aplikace na ploše. Pravděpodobně tedy budete chtít ve zprávě protokolu vyhledat konkrétní slovo nebo větu. Od systemd v237 je to nyní možné.
V journalctl se při hledání nerozlišují malá a velká písmena, pokud hledané slovo obsahuje všechna malá písmena. Pokud tedy prohledáváte slovo port, prohledá také slovo port s velkými písmeny. Příklad:
# journalctl --catalog --lines = 3000 --pager-end --grep = "port"Nyní, pokud hledáte slovo jako CPU, bude vyhledávat pouze CPU se všemi velkými písmeny, nebude hledat CPU.
# journalctl --catalog --lines = 3000 --pager-end --grep = "CPU"Pamatujete si chybovou zprávu z externího systému? Obecně tyto zprávy obsahují časové razítko. Chcete-li filtrovat zprávu protokolu, můžete použít toto časové razítko. journalctl vám může zobrazit všechny zprávy protokolu od určitého data a času s argumentem -since:
# journalctl --catalog --since = "2018-07-30 09:30:00"Pokud je tento externí systém vzdálený nebo používá časová razítka UTC, budete chtít filtrovat na základě data a času UTC a zobrazit v terminálu časová razítka UTC, takže si je nemusíte převádět ve své hlavě, což bývá opravdu matoucí. Chcete-li tak učinit, budete muset přidat UTC za časový řetězec v argumentu -since. Poté budete muset přidat příznak -utc. Například:
# journalctl --catalog --since = "2018-07-30 10:45:00 UTC" --utcVšimněte si, že můžete použít samotný příznak -utc, v tomto případě v zásadě zobrazí všechna data a časy v časovém pásmu UTC.
# journalctl --catalog --lines = 3000 --pager-end --utcProtokoly jsou lépe spravovány pomocí journalctl
Jak můžete vidět u všech předchozích příkazů, systemd journaling usnadňuje filtrování a ladění, protože můžete vybírat všechny řádky protokolu pomocí jediného příkazu journalctl. Někteří z vás pravděpodobně věděli ve starověku, kdy jste museli ručně otevřít každý soubor v / var / log, abyste měli obecnou představu o problému a o tom, co se stalo. Se všemi tipy, které jste se zde naučili, budete vlastnit solidní nástroje pro prohlížení vašich zpráv protokolu tak, jak to VY chcete.