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.
- Håndtering af systemstartprocesser og -tjenester (SysVinit, Systemd og Upstart)
- Petiti - Et open source loganalyseværktøj til Linux SysAdmins
- Sådan opsættes og styres logrotation ved hjælp af Logrotate i Linux
- 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.