Administrer logmeddelelser under Systemd ved hjælp af Journalctl [Omfattende vejledning]


Systemd er et banebrydende system- og servicemanager til Linux-systemer: en init-daemon-erstatning beregnet til at starte processer parallelt ved systemstart. Det understøttes nu i en række aktuelle mainstream-distributioner inklusive Fedora, Debian, Ubuntu, OpenSuSE, Arch, RHEL, CentOS osv.

Tidligere forklarede vi historien bag 'init' og 'systemd'; hvor vi diskuterede, hvad de to dæmoner er, hvorfor 'init' teknisk skulle udskiftes med 'systemd' samt de vigtigste funktioner i systemd.

En af de største fordele ved systemd i forhold til andre almindelige init-systemer er understøttelse af centraliseret styring af systemet og logning af processer ved hjælp af en journal. I denne artikel vil vi lære at administrere og se logbeskeder under systemd ved hjælp af journalctl-kommandoen i Linux.

Vigtigt: Før du går videre i denne vejledning, vil du måske lære at styre oprettelse og kørsel af nye serviceenheder i systemd ved hjælp af shell-scripts i Linux. Men hvis du er okay med alt det ovenstående, skal du fortsætte med at læse igennem.

Konfiguration af Journald til indsamling af logmeddelelser under Systemd

journald er en dæmon, der samler og skriver journalposter fra hele systemet; disse er i det væsentlige boot-meddelelser, meddelelser fra kernen og fra syslog eller forskellige applikationer, og det gemmer alle meddelelserne på en central placering - journalfil.

Du kan kontrollere journalds opførsel via dens standardkonfigurationsfil: /etc/systemd/journald.conf, der genereres på kompileringstidspunktet. Denne fil indeholder indstillinger, hvis værdier du kan ændre for at imødekomme dine lokale miljøkrav.

Nedenfor er et eksempel på, hvordan filen ser ud, set med kat-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

Bemærk, at forskellige pakkeinstallationer og brug af konfigurationsekstrakter i /usr/lib/systemd/*.conf.d/ og kørselstidskonfigurationer kan findes i /run/systemd/journald.conf.d/*.conf, som du muligvis ikke nødvendigvis bemærker brug.

Et antal Linux-distributioner inklusive Ubuntu og dets derivater som Linux Mint muliggør ikke vedvarende lagring af boot-meddelelser på disken som standard.

Det er muligt at aktivere dette ved at indstille "Storage" til "persistent" som vist nedenfor. Dette opretter kataloget/var/log/journal, og alle journalfiler gemmes under den.

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

For yderligere indstillinger, find betydningen af alle indstillinger, som formodes at være konfigureret under "[Journal]" sektionen ved at skrive.

$ man journald.conf

For pålidelig loghåndtering under systemd ved hjælp af journald-service skal du sikre dig, at tidsindstillingerne inklusive tidszonen er korrekte på systemet.

For at se de aktuelle indstillinger for dato og klokkeslæt på dit system skal du skrive.

$ 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

Brug kommandoerne nedenfor for at indstille den korrekte tidszone og muligvis systemtid.

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

journalctl er et hjælpeprogram, der bruges til at se indholdet af systemd-journal (som er skrevet af journald service).

For at vise alle indsamlede logfiler uden filtrering skal du skrive.

$ 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

Du kan vise en liste over startnumre (i forhold til den aktuelle boot), deres id'er og tidsstemplerne for den første og sidste meddelelse, der svarer til boot med indstillingen --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 

For at se journalposter fra den aktuelle boot (nummer 0) skal du bruge kontakten -b som denne (samme som eksemplet på output ovenfor).

$ journalctl -b

og for at se en journal fra den forrige opstart skal du bruge den relative kode -1 med indstillingen -b som nedenfor.

$ journalctl -b -1

Alternativt kan du bruge boot-id'et som dette.

$ journalctl -b 9fb590b48e1242f58c2579defdbbddc9

Hvis du vil bruge tid i Coordinated Universal Time (UTC) -format, skal du tilføje indstillingerne --utc som følger.

$ journalctl --utc

For at se alle poster siden en bestemt dato og tid, f.eks. 15. juni 2017 kl. 8:15 skal du skrive denne kommando.

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

For at se nylige logmeddelelser (10 som standard) skal du bruge flagget -n som vist nedenfor.

$ journalctl -n
$ journalctl -n 20 

Hvis du kun vil se kernemeddelelser, der ligner kommandoutputet fra dmesg, kan du bruge flagget -k .

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

For at se alle journalposter for en bestemt enhed skal du bruge -u -kontakten som følger.

$ journalctl -u apache2.service

For at nul ned til den aktuelle boot skal du skrive denne kommando.

$ journalctl -b -u apache2.service

Brug denne for at få vist logfiler fra den forrige opstart.

$ journalctl -b -1 -u apache2.service

Nedenfor er nogle andre nyttige kommandoer:

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

For at se logfiler genereret af en bestemt proces skal du angive, at det er PID som dette.

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

Hvis du vil se logfiler, der er genereret af en bestemt bruger eller gruppe, skal du angive det bruger- eller gruppe-id som dette.

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

For at vise alle logfiler, der er genereret af en fil (muligvis en eksekverbar), såsom D-Bus-eksekverbar eller bash-eksekverbar, skal du blot skrive.

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

Du kan også filtrere output baseret på meddelelsesprioriteter eller prioritetsområder ved hjælp af -p -flagget. De mulige værdier er: 0 - emerg, 1 - alarm, 2 - crit, 3 - err, 4 - advarsel, 5 - notice, 6 - info, 7 - debug):

$ journalctl -p err

For at specificere et interval skal du bruge nedenstående format (komme frem til advarsel).

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

Du kan praktisk talt se logfiler, når de skrives med indstillingen -f (svarer til tail -f-funktionalitet).

$ journalctl -f

Hvis du vil kontrollere outputformateringen af journalposterne, skal du tilføje -o -flagget og bruge disse indstillinger: cat, export, json, json-pretty, json-sse, short, short-iso, kort-monoton, kort-præcis og detaljeret (tjek betydningen af muligheder i mandsiden:

Katindstillingen viser den aktuelle meddelelse for hver journalpost uden nogen metadata (tidsstempel osv.).

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

For at kontrollere journalfilen for intern konsistens skal du bruge indstillingen --verify . Hvis alt er i orden, skal output angive en 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

Du kan også få vist den aktuelle diskbrug af alle journalfiler med indstillingerne --disk-brug . Det viser summen af diskforbruget af alle arkiverede og aktive journalfiler:

$ journalctl --disk-usage

For at slette gamle (arkiverede) journalfiler kør nedenstående kommandoer:

$ 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

Sidst men ikke mindst kan du bede journald om at rotere journalfiler med indstillingen --rotate . Bemærk, at dette direktiv ikke vender tilbage, før rotationsoperationen er afsluttet:

$ sudo journalctl --rotate

For en detaljeret brugsanvisning og valgmuligheder, se journalctl man-siden som følger.

$ man journalctl

Tjek nogle nyttige artikler.

  1. Håndtering af systemstartprocesser og -tjenester (SysVinit, Systemd og Upstart)
  2. Petiti - Et open source loganalyseværktøj til Linux SysAdmins
  3. Sådan opsættes og styres logrotation ved hjælp af Logrotate i Linux
  4. lnav - Se og analyser Apache-logfiler fra en Linux-terminal

Det er det for nu. Brug feedbacken nedenunder til at stille spørgsmål eller tilføje tanker om dette emne.