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.

  1. Upravljanje postopka zagona sistema in storitev (SysVinit, Systemd in Upstart)
  2. Petiti - odprtokodno orodje za analizo dnevnika za Linux SysAdmins
  3. Kako nastaviti in upravljati sukanje dnevnika z uporabo Logrotate v Linuxu
  4. 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.