Tvarkykite žurnalo pranešimus sistemoje „Systemd“ naudodami „Journalctl“ [išsamus vadovas]


„Systemd“ yra pažangiausia „Linux“ sistemų sistema ir paslaugų tvarkyklė: „init“ deemono pakeitimas, skirtas procesams paleisti lygiagrečiai paleidžiant sistemą. Dabar jis palaikomas keliuose dabartiniuose pagrindiniuose platinimuose, įskaitant „Fedora“, „Debian“, „Ubuntu“, „OpenSuSE“, „Arch“, RHEL, „CentOS“ ir kt.

Anksčiau mes paaiškinome „init“ ir „systemd“ istoriją; kur aptarėme, kokie yra du demonai, kodėl „init“ techniškai reikėjo pakeisti „systemd“, taip pat pagrindinius „systemd“ bruožus.

Vienas pagrindinių „systemd“ pranašumų, palyginti su kitomis įprastomis „init“ sistemomis, yra palaikymas centralizuotam sistemos ir procesų registravimo valdymui naudojant žurnalą. Šiame straipsnyje mes sužinosime, kaip tvarkyti ir peržiūrėti žurnalo pranešimus sistemoje „system“ naudojant „Linuxct“ komandą journalctl.

Svarbu: prieš eidami toliau šiame vadove, galbūt norėsite sužinoti, kaip tvarkyti naujų paslaugų vienetų kūrimą ir vykdymą sistemoje naudojant „shell“ scenarijus „Linux“. Tačiau, jei viskas gerai, tęskite toliau.

„Journald“ konfigūravimas rinkti žurnalo pranešimus sistemoje

žurnalas yra demonas, kuris renka ir rašo žurnalo įrašus iš visos sistemos; tai iš esmės yra įkrovos pranešimai, pranešimai iš branduolio ir iš „syslog“ ar įvairių programų, o visi pranešimai saugomi centrinėje vietoje - žurnalo faile.

Galite valdyti žurnalo elgseną naudodami numatytąjį konfigūracijos failą: /etc/systemd/journald.conf, kuris sukuriamas kompiliavimo metu. Šiame faile yra parinkčių, kurių reikšmes galite pakeisti, kad atitiktų jūsų vietinės aplinkos reikalavimus.

Žemiau pateikiamas failo išvaizdos pavyzdys, žiūrimas naudojant katės komandą.

$ 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

Atminkite, kad įvairius paketų diegimus ir konfigūravimo ištraukas naudoja /usr/lib/systemd/*.conf.d/ ir vykdymo laiko konfigūracijas galite rasti aplanke /run/systemd/journald.conf.d/*.conf, kurių nebūtinai turite naudoti.

Keletas „Linux“ paskirstymų, įskaitant „Ubuntu“ ir jo darinius, tokius kaip „Linux Mint“, pagal numatytuosius nustatymus neįgalina nuolatinio įkrovos pranešimų saugojimo diske.

Tai įmanoma įjungti nustatant parinktį „Saugojimas“ į „nuolatinę“, kaip parodyta žemiau. Tai sukurs katalogą/var/log/journal ir visi žurnalo failai bus saugomi jame.

$ sudo vi /etc/systemd/journald.conf 
OR
$ sudo nano /etc/systemd/journald.conf 
[Journal]
Storage=persistent

Norėdami gauti papildomų nustatymų, suraskite visų parinkčių, kurios turėtų būti sukonfigūruotos, prasmę skyriuje „[Žurnalas]“ įvesdami.

$ man journald.conf

Norėdami patikimai tvarkyti žurnalą sistemoje, naudodami „journalnald“ paslaugą, įsitikinkite, kad sistemoje teisingi laiko nustatymai, įskaitant laiko juostą.

Norėdami peržiūrėti dabartinius datos ir laiko nustatymus sistemoje, įveskite.

$ 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

Norėdami nustatyti teisingą laiko juostą ir galbūt sistemos laiką, naudokite toliau pateiktas komandas.

$ sudo timedatectl set-timezone  Africa/Kampala
$ sudo timedatectl set-time “13:50:00”

journalctl yra įrankis, naudojamas peržiūrėti systemd žurnalo (kurį rašo žurnalo tarnyba) turiniui.

Norėdami rodyti visus surinktus žurnalus be jokio filtravimo, įveskite.

$ 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

Galite rodyti įkrovos numerių sąrašą (palyginti su dabartiniu įkrovimu), jų ID ir pirmojo bei paskutinio pranešimo, atitinkančio įkrovą, laiko žymes naudodami parinktį --list-boots .

$ 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 

Norėdami peržiūrėti žurnalo įrašus iš dabartinio įkrovos (numeris 0), naudokite tokį jungiklį -b (tas pats, kas aukščiau pateiktas pavyzdinis išvestis).

$ journalctl -b

ir norėdami pamatyti ankstesnio įkrovos žurnalą, naudokite santykinį rodyklę -1 su parinktimi -b , kaip nurodyta toliau.

$ journalctl -b -1

Arba naudokite tokį įkrovos ID.

$ journalctl -b 9fb590b48e1242f58c2579defdbbddc9

Norėdami naudoti laiką suderintu universaliu laiku (UTC) formatu, pridėkite parinktis --utc taip.

$ journalctl --utc

Norėdami pamatyti visus įrašus nuo tam tikros datos ir laiko, pvz. 2017 m. Birželio 15 d., 8:15, įveskite šią komandą.

$ journalctl --since "2017-06-15 08:15:00"
$ journalctl --since today
$ journalctl --since yesterday

Norėdami peržiūrėti naujausius žurnalo pranešimus (pagal numatytuosius nustatymus - 10), naudokite vėliavą -n , kaip parodyta žemiau.

$ journalctl -n
$ journalctl -n 20 

Norėdami matyti tik branduolio pranešimus, panašius į komandos dmesg išvestį, galite naudoti žymę -k .

$ journalctl -k 
$ journalctl -k -b 
$ journalctl -k -b 9fb590b48e1242f58c2579defdbbddc9

Norėdami peržiūrėti visus tam tikro vieneto žurnalo įrašus, naudokite jungiklį -u taip.

$ journalctl -u apache2.service

Norėdami nulį nustatyti iki dabartinio įkrovimo, įveskite šią komandą.

$ journalctl -b -u apache2.service

Norėdami parodyti ankstesnio įkrovos žurnalus, naudokite tai.

$ journalctl -b -1 -u apache2.service

Toliau pateikiamos kelios kitos naudingos komandos:

$ journalctl -u apache2.service  
$ journalctl -u apache2.service --since today
$ journalctl -u apache2.service -u nagios.service --since yesterday

Jei norite peržiūrėti konkretaus proceso sugeneruotus žurnalus, nurodykite, kad tai PID.

$ journalctl _PID=19487
$ journalctl _PID=19487 --since today
$ journalctl _PID=19487 --since yesterday

Norėdami peržiūrėti konkretaus vartotojo ar grupės sugeneruotus žurnalus, nurodykite jo vartotojo ar grupės ID.

$ journalctl _UID=1000
$ journalctl _UID=1000 --since today
$ journalctl _UID=1000 -b -1 --since today

Norėdami parodyti visus failo (galbūt vykdomojo failo) sugeneruotus žurnalus, pvz., „D-Bus“ vykdomąjį arba „bash“ vykdomuosius, tiesiog įveskite.

$ journalctl /usr/bin/dbus-daemon
$ journalctl /usr/bin/bash

Taip pat galite filtruoti išvestį pagal pranešimų prioritetus ar prioritetų diapazonus naudodami žymę -p . Galimos reikšmės: 0 - atsirasti, 1 - perspėjimas, 2 - kritinis, 3 - klaida, 4 - įspėjimas, 5 - pranešimas, 6 - informacija, 7 - derinimas):

$ journalctl -p err

Norėdami nurodyti diapazoną, naudokite žemiau pateiktą formatą (atsiras įspėjimui).

$ journalctl -p 1..4
OR
$ journalctl -p emerg..warning

Praktiškai galite žiūrėti žurnalus, kai jie rašomi, naudodami parinktį -f (panašiai kaip „tail -f“ funkcija).

$ journalctl -f

Jei norite valdyti žurnalo įrašų išvesties formatavimą, pridėkite vėliavą -o ir naudokite šias parinktis: cat, export, json, json-pretty, json-sse, short, short-iso, trumpas-monotoniškas, trumpas-tikslus ir išsamus (patikrinkite parinkčių reikšmę vyro puslapyje:

Katės parinktis rodo tikrąjį kiekvieno žurnalo įrašo pranešimą be jokių metaduomenų (laiko žymos ir pan.).

$ journalctl -b -u apache2.service -o cat

Norėdami patikrinti žurnalo failo vidinį nuoseklumą, naudokite parinktį --verify . Jei viskas gerai, išvestyje turėtų būti nurodyta 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

Taip pat galite parodyti dabartinį visų žurnalo failų naudojimą naudodami parinktis --disk-use . Tai rodo visų archyvuotų ir aktyvių žurnalų failų disko naudojimo sumą:

$ journalctl --disk-usage

Norėdami ištrinti senus (archyvuotus) žurnalo failus, vykdykite toliau nurodytas komandas:

$ 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

Paskutinis, bet ne mažiau svarbus dalykas - galite nurodyti žurnalui pasukti žurnalo failus naudodami parinktį --rotate . Atkreipkite dėmesį, kad ši direktyva negrąžinama, kol pasibaigia sukimo operacija:

$ sudo journalctl --rotate

Norėdami gauti išsamų naudojimo vadovą ir parinktis, žiūrėkite „journalctl“ žmogaus puslapį taip.

$ man journalctl

Peržiūrėkite keletą naudingų straipsnių.

  1. Sistemos paleidimo proceso ir paslaugų („SysVinit“, „Systemd“ ir „Upstart“) valdymas
  2. „Petiti“ - „Linux SysAdmins“ atvirojo kodo žurnalų analizės įrankis
  3. Kaip nustatyti ir valdyti žurnalo kaitaliojimą naudojant „Linux“ programą „Logrotate“
  4. lnav - žiūrėkite ir analizuokite „Apache“ žurnalus iš „Linux“ terminalo

Kol kas tiek. Naudokitės žemiau pateiktais atsiliepimais, jei norite užduoti klausimų ar pateikti minčių šia tema.