Upravljanje dnevniških sporočil pod Systemd z uporabo Journalctl [Izčrpen vodnik]
Systemd je najsodobnejši sistem in upravitelj storitev za sisteme Linux: nadomestni demon init, namenjen vzporednemu zagonu procesov ob zagonu sistema. Zdaj je podprt v številnih trenutnih distribucijah, vključno s Fedora, Debian, Ubuntu, OpenSuSE, Arch, RHEL, CentOS itd.
Prej smo razložili zgodbo za 'init' in 'systemd'; kjer smo razpravljali o tem, kaj sta dva demona, zakaj je bilo treba 'init' tehnično zamenjati z 'systemd', pa tudi o glavnih značilnostih systemd.
Ena glavnih prednosti systemd-a pred drugimi običajnimi sistemi init je podpora centraliziranemu upravljanju dnevnika sistemov in procesov z uporabo dnevnika. V tem članku bomo izvedeli, kako upravljati in si ogledati dnevniška sporočila v sistemu systemd z uporabo ukaza journalctl v Linuxu.
Pomembno: Preden nadaljujete v tem priročniku, se boste morda želeli naučiti, kako upravljati ustvarjanje in izvajanje novih servisnih enot v systemd s skripti lupine v Linuxu. Če pa se z vsem naštetim strinjate, nadaljujte z branjem.
Konfiguriranje Journalda za zbiranje dnevniških sporočil pod Systemd
journald je demon, ki zbira in piše vnose v dnevnik iz celotnega sistema; to so v bistvu zagonska sporočila, sporočila iz jedra in iz sysloga ali različnih aplikacij, vsa sporočila pa shranijo na osrednjo lokacijo - datoteko dnevnika.
Obnašanje journald -a lahko nadzirate s privzeto konfiguracijsko datoteko: /etc/systemd/journald.conf, ki se ustvari med prevajanjem. Ta datoteka vsebuje možnosti, katerih vrednosti lahko spremenite tako, da ustrezajo vašim zahtevam lokalnega okolja.
Spodaj je prikazan videz datoteke, ki si jo ogledamo z ukazom cat.
$ cat /etc/systemd/journald.conf
# See journald.conf(5) for details. [Journal] #Storage=auto #Compress=yes #Seal=yes #SplitMode=uid #SyncIntervalSec=5m #RateLimitInterval=30s #RateLimitBurst=1000 #SystemMaxUse= #SystemKeepFree= #SystemMaxFileSize= #SystemMaxFiles=100 #RuntimeMaxUse= #RuntimeKeepFree= #RuntimeMaxFileSize= #RuntimeMaxFiles=100 #MaxRetentionSec= #MaxFileSec=1month #ForwardToSyslog=yes #ForwardToKMsg=no #ForwardToConsole=no #ForwardToWall=yes #TTYPath=/dev/console #MaxLevelStore=debug #MaxLevelSyslog=debug #MaxLevelKMsg=notice #MaxLevelConsole=info #MaxLevelWall=emerg
Upoštevajte, da lahko različne namestitve paketov in uporabo izvlečkov konfiguracije v /usr/lib/systemd/*.conf.d/ in konfiguracije časa izvajanja najdete v /run/systemd/journald.conf.d/*.conf, kar morda ni nujno uporaba.
Številne distribucije Linuxa, vključno z Ubuntujem in njegovimi derivati, kot je Linux Mint, privzeto ne omogočajo trajnega shranjevanja zagonskih sporočil na disku.
To lahko omogočite tako, da možnost\"Storage" nastavite na\"persistent", kot je prikazano spodaj. S tem boste ustvarili imenik/var/log/journal in vse datoteke dnevnika bodo shranjene v njem.
$ sudo vi /etc/systemd/journald.conf OR $ sudo nano /etc/systemd/journald.conf
[Journal] Storage=persistent
Za dodatne nastavitve poiščite pomen vseh možnosti, ki naj bi bile konfigurirane v razdelku »[Journal]« s tipkanjem.
$ man journald.conf
Za zanesljivo upravljanje dnevnikov v sistemu systemd s storitvijo journald zagotovite, da so časovne nastavitve, vključno s časovnim pasom, pravilne v sistemu.
Če si želite ogledati trenutne nastavitve datuma in časa v sistemu, vnesite.
$ timedatectl OR $ timedatectl status Local time: Thu 2017-06-15 13:29:09 EAT Universal time: Thu 2017-06-15 10:29:09 UTC RTC time: Thu 2017-06-15 10:29:09 Time zone: Africa/Kampala (EAT, +0300) Network time on: yes NTP synchronized: yes RTC in local TZ: no
Če želite nastaviti pravi časovni pas in morda sistemski čas, uporabite spodnje ukaze.
$ sudo timedatectl set-timezone Africa/Kampala $ sudo timedatectl set-time “13:50:00”
journalctl je pripomoček, ki se uporablja za ogled vsebine sistemskega dnevnika (ki ga piše journal servis).
Če želite prikazati vse zbrane dnevnike brez kakršnega koli filtriranja, vnesite.
$ journalctl
-- Logs begin at Wed 2017-06-14 21:56:43 EAT, end at Thu 2017-06-15 12:28:19 EAT Jun 14 21:56:43 tecmint systemd-journald[336]: Runtime journal (/run/log/journal Jun 14 21:56:43 tecmint kernel: Initializing cgroup subsys cpuset Jun 14 21:56:43 tecmint kernel: Initializing cgroup subsys cpu Jun 14 21:56:43 tecmint kernel: Initializing cgroup subsys cpuacct Jun 14 21:56:43 tecmint kernel: Linux version 4.4.0-21-generic ([email ) Jun 14 21:56:43 tecmint kernel: Command line: BOOT_IMAGE=/boot/vmlinuz-4.4.0-21- Jun 14 21:56:43 tecmint kernel: KERNEL supported cpus: Jun 14 21:56:43 tecmint kernel: Intel GenuineIntel Jun 14 21:56:43 tecmint kernel: AMD AuthenticAMD Jun 14 21:56:43 tecmint kernel: Centaur CentaurHauls Jun 14 21:56:43 tecmint kernel: x86/fpu: xstate_offset[2]: 576, xstate_sizes[2] Jun 14 21:56:43 tecmint kernel: x86/fpu: Supporting XSAVE feature 0x01: 'x87 flo Jun 14 21:56:43 tecmint kernel: x86/fpu: Supporting XSAVE feature 0x02: 'SSE reg Jun 14 21:56:43 tecmint kernel: x86/fpu: Supporting XSAVE feature 0x04: 'AVX reg Jun 14 21:56:43 tecmint kernel: x86/fpu: Enabled xstate features 0x7, context si Jun 14 21:56:43 tecmint kernel: x86/fpu: Using 'eager' FPU context switches. Jun 14 21:56:43 tecmint kernel: e820: BIOS-provided physical RAM map: Jun 14 21:56:43 tecmint kernel: BIOS-e820: [mem 0x0000000000000000-0x00000000000 Jun 14 21:56:43 tecmint kernel: BIOS-e820: [mem 0x0000000000090000-0x00000000000 Jun 14 21:56:43 tecmint kernel: BIOS-e820: [mem 0x0000000000100000-0x000000001ff Jun 14 21:56:43 tecmint kernel: BIOS-e820: [mem 0x0000000020000000-0x00000000201 Jun 14 21:56:43 tecmint kernel: BIOS-e820: [mem 0x0000000020200000-0x00000000400
Z možnostjo --list-boots
lahko prikažete seznam zagonskih številk (glede na trenutni zagon), njihove ID-je in časovne žige prvega in zadnjega sporočila, ki ustrezajo zagonu.
$ journalctl --list-boots -1 9fb590b48e1242f58c2579defdbbddc9 Thu 2017-06-15 16:43:36 EAT—Thu 2017-06-15 1 0 464ae35c6e264a4ca087949936be434a Thu 2017-06-15 16:47:36 EAT—Thu 2017-06-15 1
Če si želite ogledati vnose v dnevnik iz trenutnega zagona (številka 0), uporabite stikalo -b
, kot je to (enako kot zgornji vzorec).
$ journalctl -b
in če si želite ogledati dnevnik iz prejšnjega zagona, uporabite relativni kazalec -1
z možnostjo -b
, kot je prikazano spodaj.
$ journalctl -b -1
Uporabite lahko tudi ID zagona, kot je ta.
$ journalctl -b 9fb590b48e1242f58c2579defdbbddc9
Če želite uporabiti čas v obliki koordiniranega univerzalnega časa (UTC), dodajte možnosti --utc
, kot sledi.
$ journalctl --utc
Če si želite ogledati vse vnose od določenega datuma in ure, npr. 15. junij 2017 ob 8:15, vnesite ta ukaz.
$ journalctl --since "2017-06-15 08:15:00" $ journalctl --since today $ journalctl --since yesterday
Če si želite ogledati nedavna sporočila dnevnika (privzeto 10), uporabite zastavico -n
, kot je prikazano spodaj.
$ journalctl -n $ journalctl -n 20
Če želite videti samo sporočila jedra, podobna izhodu ukaza dmesg, lahko uporabite zastavico -k
.
$ journalctl -k $ journalctl -k -b $ journalctl -k -b 9fb590b48e1242f58c2579defdbbddc9
Če si želite ogledati vse vnose v dnevnik za določeno enoto, uporabite stikalo -u
, kot sledi.
$ journalctl -u apache2.service
Če želite premakniti trenutni zagon, vnesite ta ukaz.
$ journalctl -b -u apache2.service
Za prikaz dnevnikov iz prejšnjega zagona uporabite to.
$ journalctl -b -1 -u apache2.service
Spodaj je še nekaj uporabnih ukazov:
$ journalctl -u apache2.service $ journalctl -u apache2.service --since today $ journalctl -u apache2.service -u nagios.service --since yesterday
Če si želite ogledati dnevnike, ki jih je ustvaril določen postopek, določite, da gre za PID, kot je ta.
$ journalctl _PID=19487 $ journalctl _PID=19487 --since today $ journalctl _PID=19487 --since yesterday
Če si želite ogledati dnevnike, ki jih je ustvaril določen uporabnik ali skupina, navedite ID uporabnika ali skupine, kot je ta.
$ journalctl _UID=1000 $ journalctl _UID=1000 --since today $ journalctl _UID=1000 -b -1 --since today
Če želite prikazati vse dnevnike, ki jih ustvari datoteka (po možnosti izvedljiva datoteka), na primer izvedljiva datoteka D-Bus ali izvedljiva datoteka bash, preprosto vnesite.
$ journalctl /usr/bin/dbus-daemon $ journalctl /usr/bin/bash
Izhod lahko tudi filtrirate na podlagi prioritet sporočil ali obsegov prioritet z uporabo zastavice -p
. Možne vrednosti so: 0 - pojav, 1 - opozorilo, 2 - kritika, 3 - napaka, 4 - opozorilo, 5 - obvestilo, 6 - informacije, 7 - odpravljanje napak):
$ journalctl -p err
Za določitev obsega uporabite spodnjo obliko (emerg to warning).
$ journalctl -p 1..4 OR $ journalctl -p emerg..warning
Dnevnike lahko praktično gledate, ko se pišejo z možnostjo -f
(podobno kot funkcija tail -f).
$ journalctl -f
Če želite nadzorovati izhodno oblikovanje vnosov v dnevnik, dodajte zastavico -o
in uporabite te možnosti: cat, export, json, json-pretty, json-sse, short, short-iso, kratko-monotono, kratko-natančno in podrobno (preverite pomen možnosti na strani za ljudi:
Možnost mačka prikazuje dejansko sporočilo vsakega vnosa v dnevnik brez kakršnih koli metapodatkov (časovni žig in tako naprej).
$ journalctl -b -u apache2.service -o cat
Če želite datoteko dnevnika preveriti glede notranje skladnosti, uporabite možnost --verify
. Če je vse v redu, mora na izhodu biti oznaka PASS.
$ journalctl --verify PASS: /run/log/journal/2a5d5f96ef9147c0b35535562b32d0ff/system.journal 491f68: Unused data (entry_offset==0) PASS: /run/log/journal/2a5d5f96ef9147c0b35535562b32d0ff/[email 9866c3d4d.journal PASS: /run/log/journal/2a5d5f96ef9147c0b35535562b32d0ff/[email 5d8945a9e.journal PASS: /run/log/journal/2a5d5f96ef9147c0b35535562b32d0ff/[email 1becab02f.journal PASS: /run/log/journal/2a5d5f96ef9147c0b35535562b32d0ff/[email 01cfcedff.journal
Z možnostmi --disk-usage
lahko prikažete tudi trenutno uporabo diska vseh datotek dnevnika. Prikazuje vsoto uporabe diska vseh arhiviranih in aktivnih datotek dnevnika:
$ journalctl --disk-usage
Če želite izbrisati stare (arhivirane) datoteke dnevnikov, zaženite spodnje ukaze:
$ sudo journalctl --vacuum-size=50M #delete files until the disk space they use falls below the specified size $ sudo journalctl --vacuum-time=1years #delete files so that all journal files contain no data older than the specified timespan $ sudo journalctl --vacuum-files=4 #delete files so that no more than the specified number of separate journal files remain in storage location
Nenazadnje lahko Journalu naročite, da vrti datoteke dnevnikov z možnostjo --rotate
. Upoštevajte, da se ta direktiva ne vrne, dokler ni postopek rotacije končan:
$ sudo journalctl --rotate
Za poglobljen priročnik o uporabi in možnostih si oglejte mankt stran journalctl na naslednji način.
$ man journalctl
Oglejte si nekaj koristnih člankov.
- Upravljanje postopka zagona sistema in storitev (SysVinit, Systemd in Upstart)
- Petiti - odprtokodno orodje za analizo dnevnika za Linux SysAdmins
- Kako nastaviti in upravljati sukanje dnevnika z uporabo Logrotate v Linuxu
- lnav - Oglejte si in analizirajte dnevnike Apache s terminala Linux
Za zdaj je to. Uporabite povratne informacije od spodaj, če želite zastaviti kakršna koli vprašanja ali dodati svoje misli o tej temi.