Hallinnoi lokiviestejä Systemd-sovelluksessa Journalctl: n avulla [Kattava opas]


Systemd on huipputason järjestelmä- ja palvelunhallinta Linux-järjestelmille: init-daemon-korvaus, joka on tarkoitettu käynnistämään prosessit samanaikaisesti järjestelmän käynnistyksen yhteydessä. Sitä tuetaan nyt useissa nykyisissä valtavirran jakeluissa, mukaan lukien Fedora, Debian, Ubuntu, OpenSuSE, Arch, RHEL, CentOS jne.

Aikaisemmin selitimme tarinan ”init” ja ”systemd”; missä keskustelimme kahdesta demonista, miksi "init" oli teknisesti korvattava "systemd": llä sekä systemd: n pääpiirteistä.

Yksi systemd: n tärkeimmistä eduista muihin yleisiin init-järjestelmiin verrattuna on tuki keskitetylle järjestelmän ja prosessien kirjaamisen päiväkirjaa käyttäen. Tässä artikkelissa opitaan kuinka hallita ja tarkastella lokiviestejä systemd-tiedostossa käyttämällä journalctl-komentoa Linuxissa.

Tärkeää: Ennen kuin siirryt eteenpäin tässä oppaassa, saatat haluta oppia hallitsemaan uusien palveluyksiköiden luomista ja suorittamista systemd: ssä Linuxin komentosarjojen avulla. Jos olet kuitenkin kunnossa kaikilla yllä olevilla, jatka lukemista.

Journaldin määrittäminen lokiviestien keräämistä varten Systemd: ssä

journald on daemon, joka kerää ja kirjoittaa päiväkirjamerkintöjä koko järjestelmästä; nämä ovat lähinnä käynnistysviestejä, ytimen ja syslogin tai eri sovellusten viestejä, ja se tallentaa kaikki viestit keskeiseen sijaintiin - päiväkirjatiedostoon.

Voit hallita journalnaldin käyttäytymistä sen oletusasetustiedostolla: /etc/systemd/journald.conf, joka luodaan kääntämisen aikana. Tämä tiedosto sisältää vaihtoehtoja, joiden arvot voit muuttaa vastaamaan paikallisia ympäristövaatimuksiasi.

Alla on esimerkki tiedoston ulkoasusta, jota tarkastellaan kissa-komennolla.

$ 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

Huomaa, että erilaiset pakettiasennukset ja kokoonpanon otteet /usr/lib/systemd/*.conf.d/- ja ajoaikakokoonpanoista löytyvät tiedostosta /run/systemd/journald.conf.d/*.conf, joita et välttämättä välttämättä käyttää.

Useat Linux-jakelut, mukaan lukien Ubuntu, ja sen johdannaiset, kuten Linux Mint, eivät salli käynnistysviestien pysyvää tallennusta levylle oletuksena.

Tämä on mahdollista ottaa käyttöön asettamalla “Varastointi” -asetukseksi ”pysyvä” alla olevan kuvan mukaisesti. Tämä luo hakemiston/var/log/journal ja kaikki lokitiedostot tallennetaan sen alle.

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

Löydät lisäasetukset etsimällä kaikkien [Päiväkirja] -osiosta määritettävien asetusten merkityksen kirjoittamalla.

$ man journald.conf

Lokien luotettavan hallinnan varmistamiseksi systemd-sovelluksessa käyttämällä journalnald-palvelua varmista, että aika-asetukset, mukaan lukien aikavyöhyke, ovat järjestelmässä oikein.

Voit tarkastella järjestelmän nykyisiä päivämäärä- ja aika-asetuksia kirjoittamalla.

$ 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

Aseta oikea aikavyöhyke ja mahdollisesti järjestelmän aika käyttämällä alla olevia komentoja.

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

journalctl on apuohjelma, jota käytetään tarkastelemaan systemd-päiväkirjan sisältöä (jonka on kirjoittanut journald-palvelu).

Jos haluat näyttää kaikki kerätyt lokit ilman suodatusta, kirjoita.

$ 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

Voit näyttää luettelon käynnistysnumeroista (suhteessa nykyiseen käynnistykseen), niiden tunnukset ja käynnistystä vastaavan ensimmäisen ja viimeisen viestin aikaleimat --list-boots -vaihtoehdolla.

$ 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 

Jos haluat tarkastella päiväkirjamerkintöjä nykyisestä käynnistyksestä (numero 0), käytä -b -kytkintä näin (sama kuin yllä oleva esimerkkilähtö).

$ journalctl -b

ja jos haluat nähdä edellisen käynnistyksen päiväkirjan, käytä suhteellista osoitinta -1 ja -b -vaihtoehtoa kuten alla.

$ journalctl -b -1

Vaihtoehtoisesti voit käyttää käynnistystunnusta näin.

$ journalctl -b 9fb590b48e1242f58c2579defdbbddc9

Jos haluat käyttää aikaa UTC (Coordinated Universal Time) -muodossa, lisää --utc -asetukset seuraavasti.

$ journalctl --utc

Jos haluat nähdä kaikki merkinnät tietystä päivämäärästä ja kellonajasta, esim. Kirjoita tämä komento 15. kesäkuuta 2017 klo 8.15.

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

Jos haluat tarkastella viimeisimpiä lokiviestejä (oletusarvoisesti 10), käytä -n -lippua alla olevan kuvan mukaisesti.

$ journalctl -n
$ journalctl -n 20 

Jos haluat nähdä vain ytimen viestit, kuten dmesg-komennon tulos, voit käyttää -k -merkkiä.

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

Jos haluat tarkastella tietyn yksikön kaikkia päiväkirjamerkintöjä, käytä -u -kytkintä seuraavasti.

$ journalctl -u apache2.service

Nollaa nykyinen käynnistys kirjoittamalla tämä komento.

$ journalctl -b -u apache2.service

Käytä tätä, jos haluat näyttää edellisen käynnistyksen lokit.

$ journalctl -b -1 -u apache2.service

Alla on joitain muita hyödyllisiä komentoja:

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

Jos haluat tarkastella tietyn prosessin luomia lokeja, määritä sen PID-arvo tällä tavoin.

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

Jos haluat tarkastella tietyn käyttäjän tai ryhmän luomia lokeja, määritä tämän käyttäjän tai ryhmän tunnus.

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

Voit näyttää kaikki tiedoston (mahdollisesti suoritettavan) luomat lokit, kuten D-Bus-suoritettavan tai bash-suoritettavan, yksinkertaisesti kirjoittamalla.

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

Voit suodattaa lähdön myös viestien prioriteettien tai prioriteettialueiden perusteella käyttämällä -p -lippua. Mahdolliset arvot ovat: 0 - syntyminen, 1 - hälytys, 2 - kriittinen, 3 - virhe, 4 - varoitus, 5 - huomautus, 6 - info, 7 - virheenkorjaus):

$ journalctl -p err

Määritä alue käyttämällä alla olevaa muotoa (nousta varoitukseen).

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

Voit käytännössä katsella lokeja niiden kirjoittaessa -f -vaihtoehdolla (samanlainen kuin tail -f -toiminto).

$ journalctl -f

Jos haluat hallita päiväkirjamerkintöjen tulostusmuotoa, lisää lippu -o ja käytä näitä vaihtoehtoja: kissa, vienti, json, json-pretty, json-sse, lyhyt, lyhyt iso, lyhyt-yksitoikkoinen, lyhyt-tarkka ja monipuolinen (tarkista vaihtoehtojen merkitys man-sivulta:

Kissa-vaihtoehto näyttää jokaisen päiväkirjamerkinnän todellisen viestin ilman metatietoja (aikaleima ja niin edelleen).

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

Voit tarkistaa päiväkirjatiedoston sisäisen johdonmukaisuuden --verify -vaihtoehdon avulla. Jos kaikki on hyvin, lähdön tulisi ilmoittaa 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 01-000551f01cfcedff.journal

Voit myös näyttää kaikkien lokitiedostojen nykyisen levykäytön --disk-use -asetuksilla. Se näyttää kaikkien arkistoitujen ja aktiivisten päiväkirjatiedostojen levyn käytön summan:

$ journalctl --disk-usage

Poista vanhat (arkistoidut) päiväkirjatiedostot suorittamalla seuraavat komennot:

$ 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

Viimeisenä mutta ei vähäisimpänä, voit kehottaa journalnaldia kiertämään päiväkirjatiedostoja --rotate -vaihtoehdon avulla. Huomaa, että tämä direktiivi ei palaa ennen kuin kierto on valmis:

$ sudo journalctl --rotate

Katso perusteellinen käyttöopas ja vaihtoehdot katsomalla journalctl-man -sivua seuraavasti.

$ man journalctl

Tarkista hyödyllisiä artikkeleita.

  1. Järjestelmän käynnistysprosessin ja palvelujen hallinta (SysVinit, Systemd ja Upstart)
  2. Petiti - avoimen lähdekoodin lokianalyysityökalu Linux SysAdminsille
  3. Lokikierron määrittäminen ja hallinta Logrotaten avulla Linuxissa
  4. lnav - Tarkastele ja analysoi Apache-lokeja Linux-päätelaitteesta

Se on nyt. Käytä alla olevaa palautetta kysyäksesi kysymyksiä tai lisääksesi ajatuksiasi tästä aiheesta.