Administrer loggmeldinger under Systemd ved å bruke Journalctl [Omfattende veiledning]


Systemd er en banebrytende system- og tjenestebehandling for Linux-systemer: en init-demonerstatning beregnet på å starte prosesser parallelt ved systemoppstart. Det støttes nå i en rekke gjeldende mainstream-distribusjoner, inkludert Fedora, Debian, Ubuntu, OpenSuSE, Arch, RHEL, CentOS, etc.

Tidligere forklarte vi historien bak 'init' og 'systemd'; der vi diskuterte hva de to demonene er, hvorfor 'init' teknisk sett måtte erstattes med 'systemd' samt hovedfunksjonene til systemd.

En av hovedfordelene med systemd fremfor andre vanlige init-systemer er støtte for sentralisert styring av system- og prosesslogging ved hjelp av en journal. I denne artikkelen vil vi lære hvordan du administrerer og viser loggmeldinger under systemd ved å bruke journalctl-kommandoen i Linux.

Viktig: Før du går videre i denne veiledningen, kan det være lurt å lære hvordan du administrerer 'Systemd'-tjenester og -enheter ved å bruke 'Systemctl'-kommandoen, og også opprette og kjøre nye tjenesteenheter i systemd ved å bruke shell-skript i Linux. Men hvis du er ok med alt det ovennevnte, fortsett å lese gjennom.

Konfigurere journalført for å samle loggmeldinger under Systemd

journald er en demon som samler og skriver journaloppføringer fra hele systemet; disse er i hovedsak oppstartsmeldinger, meldinger fra kjernen og fra syslog eller forskjellige applikasjoner, og den lagrer alle meldingene på et sentralt sted – journalfil.

Du kan kontrollere atferden til journald via standard konfigurasjonsfilen: /etc/systemd/journald.conf som genereres på kompileringstidspunktet. Denne filen inneholder alternativer hvis verdier du kan endre for å passe dine lokale miljøkrav.

Nedenfor er et eksempel på hvordan filen ser ut, sett ved hjelp av cat-kommandoen.

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

Merk at ulike pakkeinstallasjoner og bruk av konfigurasjonsekstrakter i /usr/lib/systemd/*.conf.d/ og kjøretidskonfigurasjoner kan finnes i /run/systemd/journald.conf. d/*.conf som du kanskje ikke nødvendigvis bruker.

Aktiver lagring av journaldata på disk

En rekke Linux-distribusjoner inkludert Ubuntu og dets derivater som Linux Mint muliggjør ikke vedvarende lagring av oppstartsmeldinger på disk som standard.

Det er mulig å aktivere dette ved å sette «Lagring »-alternativet til «vedvarende» som vist nedenfor. Dette vil opprette /var/log/journal-katalogen og alle journalfilene vil bli lagret under den.

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

For ytterligere innstillinger, finn betydningen av alle alternativer som skal konfigureres under “[Journal]”-delen ved å skrive.

man journald.conf

Stille inn riktig systemtid ved å bruke Timedatectl-kommandoen

For pålitelig loggadministrasjon under systemd bruk av journalført tjeneste, sørg for at tidsinnstillingene inkludert tidssonen er riktige på systemet.

For å se gjeldende dato- og klokkeslettinnstillinger på systemet, skriv.

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

For å stille inn riktig tidssone og muligens systemtid, bruk kommandoene nedenfor.

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

Vise loggmeldinger ved hjelp av Journalctl Command

journalctl er et verktøy som brukes til å se innholdet i systemd-journalen (som er skrevet av journald-tjenesten).

For å vise alle innsamlede logger uten filtrering, skriv.

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 (buildd@lgw01-21)
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

Vis loggmeldinger basert på oppstarter

Du kan vise en liste over oppstartsnumre (i forhold til gjeldende oppstart), deres IDer og tidsstemplene til den første og siste meldingen som tilsvarer oppstarten med --list-boots-alternativet.

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 

For å se journalpostene fra gjeldende oppstart (nummer 0), bruk -b-bryteren slik (samme som eksempelutgangen ovenfor).

journalctl -b

og for å se en journal fra forrige oppstart, bruk -1 relative peker med -b alternativet som nedenfor.

journalctl -b -1

Alternativt kan du bruke oppstarts-IDen slik.

journalctl -b 9fb590b48e1242f58c2579defdbbddc9

Filtrering av loggmeldinger basert på tid

For å bruke tid i UTC-format (Coordinated Universal Time), legg til --utc-alternativene som følger.

journalctl --utc

For å se alle oppføringene siden en bestemt dato og klokkeslett, f.eks. 15. juni 2017 kl. 08.15, skriv inn denne kommandoen.

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

Viser nylige loggmeldinger

For å se nylige loggmeldinger (10 som standard), bruk -n-flagget som vist nedenfor.

journalctl -n
journalctl -n 20 

Vise loggmeldinger generert av kjernen

For å se bare kjernemeldinger, som ligner på dmesg-kommandoen, kan du bruke -k-flagget.

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

Vise loggmeldinger generert av enheter

For å se alle journalposter for en bestemt enhet, bruk -u-bryteren som følger.

journalctl -u apache2.service

For å nullstille til gjeldende oppstart, skriv inn denne kommandoen.

journalctl -b -u apache2.service

For å vise logger fra forrige oppstart, bruk denne.

journalctl -b -1 -u apache2.service

Nedenfor er noen andre nyttige kommandoer:

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

Vise loggmeldinger generert av prosesser

For å se logger generert av en bestemt prosess, spesifiser dens PID slik.

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

Vise loggmeldinger generert av bruker- eller gruppe-ID

For å se logger generert av en spesifikk bruker eller gruppe, spesifiser dens bruker- eller gruppe-ID slik.

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

Vise logger generert av en fil

For å vise alle logger generert av en fil (muligens en kjørbar fil), for eksempel D-Bus kjørbare eller bash kjørbare filer, skriv ganske enkelt.

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

Vise loggmeldinger etter prioritet

Du kan også filtrere utdata basert på meldingsprioriteter eller prioritetsområder ved å bruke -p-flagget. De mulige verdiene er: 0 – emerg, 1 – alert, 2 – crit, 3 – err, 4 – advarsel, 5 – notice, 6 – info, 7 – debug):

journalctl -p err

For å spesifisere et område, bruk formatet nedenfor (kom frem til advarsel).

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

Se loggmeldinger i sanntid

Du kan praktisk talt se logger mens de skrives med -f-alternativet (ligner på tail -f-funksjonalitet).

journalctl -f

Håndtering av journalvisningsformatering

Hvis du vil kontrollere utdataformateringen av journalpostene, legg til -o-flagget og bruk disse alternativene: cat, export, json, json-pretty, json-sse, short, short-iso, kort-monotonisk, kort presis og ordrik (sjekk betydningen av alternativene på man-siden:

Alternativet cat viser den faktiske meldingen for hver journalpost uten noen metadata (tidsstempel og så videre).

journalctl -b -u apache2.service -o cat

Administrere journaler på et system

For å sjekke journalfilen for intern konsistens, bruk --verify-alternativet. Hvis alt er bra, bør utgangen indikere et PASS.

journalctl --verify

PASS: /run/log/journal/2a5d5f96ef9147c0b35535562b32d0ff/system.journal                               
491f68: Unused data (entry_offset==0)                                                                
PASS: /run/log/journal/2a5d5f96ef9147c0b35535562b32d0ff/system@816533ecd00843c4a877a0a962e124f2-0000000000003184-000551f9866c3d4d.journal
PASS: /run/log/journal/2a5d5f96ef9147c0b35535562b32d0ff/system@816533ecd00843c4a877a0a962e124f2-0000000000001fc8-000551f5d8945a9e.journal
PASS: /run/log/journal/2a5d5f96ef9147c0b35535562b32d0ff/system@816533ecd00843c4a877a0a962e124f2-0000000000000d4f-000551f1becab02f.journal
PASS: /run/log/journal/2a5d5f96ef9147c0b35535562b32d0ff/system@816533ecd00843c4a877a0a962e124f2-0000000000000001-000551f01cfcedff.journal

Sletting av gamle journalfiler

Du kan også vise gjeldende diskbruk for alle journalfiler med --disk-bruk alternativene. Den viser summen av diskbruken til alle arkiverte og aktive journalfiler:

journalctl --disk-usage

For å slette gamle (arkiverte) journalfiler, kjør kommandoene nedenfor:

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

Roterende journalfiler

Sist, men ikke minst, kan du instruere journald til å rotere journalfiler med alternativet --rotate. Merk at dette direktivet ikke kommer tilbake før rotasjonsoperasjonen er fullført:

sudo journalctl --rotate

For en grundig bruksveiledning og alternativer, se journalctl man-siden som følger.

man journalctl

Sjekk ut noen nyttige artikler.

  1. Administrere systemoppstartsprosesser og -tjenester (SysVinit, Systemd og Upstart)
  2. Petiti – Et verktøy for åpen kildekodelogganalyse for Linux SysAdmins
  3. Hvordan sette opp og administrere loggrotasjon ved å bruke Logrotate i Linux
  4. lnav – Se og analyser Apache-logger fra en Linux-terminal

Det er det for nå. Bruk tilbakemeldingen nedenfor for å stille spørsmål eller legge til tanker om dette emnet.