Upravljanje zapisima dnevnika pod Systemd pomoću Journalctl [Sveobuhvatan vodič]


Systemd je vrhunski upravitelj sustava i usluga za Linux sustave: init zamjena demona namijenjena paralelnom pokretanju procesa pri pokretanju sustava. Sada je podržan u brojnim trenutnim mainstream distribucijama, uključujući Fedoru, Debian, Ubuntu, OpenSuSE, Arch, RHEL, CentOS itd.

Ranije smo objasnili priču iza "init" i "systemd"; gdje smo razgovarali o tome koja su dva demona, zašto je 'init' tehnički trebalo zamijeniti sa 'systemd' kao i glavne značajke systemd-a.

Jedna od glavnih prednosti systemd-a u odnosu na ostale uobičajene init-sustave je podrška centraliziranom upravljanju bilježenjem sustava i procesa pomoću dnevnika. U ovom ćemo članku naučiti kako upravljati i pregledavati poruke dnevnika pod systemd pomoću naredbe journalctl u Linuxu.

Važno: Prije nego što krenete dalje u ovom vodiču, možda ćete htjeti naučiti kako upravljati stvaranjem i pokretanjem novih servisnih jedinica u systemd-u pomoću ljuske skripti u Linuxu. Međutim, ako ste u redu sa svime navedenim, nastavite čitati.

Konfiguriranje Journalda za prikupljanje dnevničkih poruka pod Systemd

journald je demon koji okuplja i zapisuje unose u dnevnik iz cijelog sustava; to su u osnovi poruke za pokretanje, poruke iz kernela i syslog-a ili raznih aplikacija, a sve poruke pohranjuje u središnje mjesto - datoteku dnevnika.

Ponašanjem journalda možete kontrolirati putem zadane konfiguracijske datoteke: /etc/systemd/journald.conf koja se generira u vrijeme kompajliranja. Ova datoteka sadrži opcije čije vrijednosti možete promijeniti kako bi zadovoljile vaše zahtjeve lokalnog okruženja.

Ispod je uzorak kako datoteka izgleda, pregledano pomoću naredbe cat.

$ 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

Imajte na umu da se različita instaliranja paketa i koriste ekstrakti konfiguracije u /usr/lib/systemd/*.conf.d/ i konfiguracije vremena izvođenja mogu naći u /run/systemd/journald.conf.d/*.conf što možda ne morate nužno koristiti.

Brojne distribucije Linuxa, uključujući Ubuntu i njegove derivate poput Linux Mint, prema zadanim postavkama ne omogućuju trajno spremanje poruka pokretanja na disk.

To je moguće omogućiti postavljanjem opcije "Pohrana" na "trajno" kao što je prikazano u nastavku. Ovo će stvoriti direktorij/var/log/journal i u njemu će se pohraniti sve datoteke dnevnika.

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

Za dodatne postavke upišite značenje svih opcija koje bi trebale biti konfigurirane u odjeljku "[Journal]".

$ man journald.conf

Za pouzdano upravljanje zapisima u sustavu koji koristi uslugu journald, osigurajte da su vremenske postavke, uključujući vremensku zonu, točne na sustavu.

Upišite kako biste vidjeli trenutne postavke datuma i vremena na vašem sustavu.

$ 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

Da biste postavili točnu vremensku zonu i možda sistemsko vrijeme, upotrijebite naredbe u nastavku.

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

journalctl je uslužni program koji se koristi za pregled sadržaja systemd dnevnika (koji piše journal servis).

Upišite kako biste prikazali sve prikupljene zapisnike bez ikakvog filtriranja.

$ 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

Možete prikazati popis brojeva pokretanja (u odnosu na trenutačno pokretanje), njihove ID-ove i vremenske oznake prve i zadnje poruke koja odgovaraju pokretanju s opcijom --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 

Da biste pregledali unose dnevnika iz trenutnog pokretanja (broj 0), upotrijebite prekidač -b poput ovog (isti kao gornji uzorak).

$ journalctl -b

a da biste vidjeli dnevnik iz prethodnog pokretanja, upotrijebite relativni pokazivač -1 s opcijom -b kao dolje.

$ journalctl -b -1

Ili upotrijebite ID za pokretanje poput ovog.

$ journalctl -b 9fb590b48e1242f58c2579defdbbddc9

Da biste koristili vrijeme u formatu koordiniranog univerzalnog vremena (UTC), dodajte opcije --utc kako slijedi.

$ journalctl --utc

Da biste vidjeli sve unose od određenog datuma i vremena, npr. 15. lipnja 2017. u 08:15 unesite ovu naredbu.

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

Da biste pogledali nedavne poruke dnevnika (10 prema zadanim postavkama), upotrijebite zastavicu -n kako je prikazano u nastavku.

$ journalctl -n
$ journalctl -n 20 

Da biste vidjeli samo poruke jezgre, slično izlazu naredbe dmesg, možete upotrijebiti zastavicu -k .

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

Da biste mogli pregledati sve unose dnevnika za određenu jedinicu, upotrijebite prekidač -u na sljedeći način.

$ journalctl -u apache2.service

Za nulu do trenutnog pokretanja upišite ovu naredbu.

$ journalctl -b -u apache2.service

Koristite ovo za prikaz dnevnika iz prethodnog pokretanja.

$ journalctl -b -1 -u apache2.service

Ispod su neke druge korisne naredbe:

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

Da biste pregledali zapisnike generirane određenim postupkom, navedite da je to PID ovako.

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

Da biste pregledali zapisnike koje je generirao određeni korisnik ili grupa, navedite da li je ovo ID korisnika ili grupe.

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

Da biste prikazali sve zapisnike generirane u datoteci (moguće izvršnu datoteku), poput izvršne datoteke D-Bus ili bash, jednostavno upišite.

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

Također možete filtrirati izlaz na temelju prioriteta poruka ili raspona prioriteta pomoću zastavice -p . Moguće vrijednosti su: 0 - emerg, 1 - upozorenje, 2 - kritično, 3 - pogreška, 4 - upozorenje, 5 - obavijest, 6 - informacije, 7 - otklanjanje pogrešaka):

$ journalctl -p err

Da biste odredili raspon, upotrijebite donji format (pojaviti se na upozorenje).

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

Možete praktički gledati zapisnike kako su zapisani pomoću opcije -f (slično funkciji tail -f).

$ journalctl -f

Ako želite kontrolirati izlazno formatiranje unosa dnevnika, dodajte zastavicu -o i upotrijebite ove opcije: cat, export, json, json-pretty, json-sse, short, short-iso, kratko-monotono, kratko-precizno i opširno (provjerite značenje opcija na man stranici:

Opcija cat prikazuje stvarnu poruku svakog unosa u dnevnik bez ikakvih metapodataka (vremenska oznaka i tako dalje).

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

Da biste provjerili unutarnju dosljednost datoteke dnevnika, upotrijebite opciju --verify . Ako je sve u redu, na izlazu se mora nalaziti 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

Također možete prikazati trenutnu upotrebu diska svih datoteka dnevnika s opcijama --disk-usage . Prikazuje zbroj upotrebe diska svih arhiviranih i aktivnih datoteka dnevnika:

$ journalctl --disk-usage

Da biste izbrisali stare (arhivirane) datoteke dnevnika, pokrenite naredbe u nastavku:

$ 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

I na kraju, ali ne najmanje važno, možete uputiti journald da rotira datoteke dnevnika pomoću opcije --rotate . Imajte na umu da se ova direktiva ne vraća dok se operacija rotacije ne završi:

$ sudo journalctl --rotate

Za detaljni vodič i mogućnosti upotrebe pogledajte manct stranicu journalctl kako slijedi.

$ man journalctl

Pogledajte neke korisne članke.

  1. Upravljanje postupkom pokretanja sustava i uslugama (SysVinit, Systemd i Upstart)
  2. Petiti - Alat za analizu dnevnika otvorenog koda za Linux SysAdmins
  3. Kako postaviti i upravljati rotacijom dnevnika pomoću Logrotatea u Linuxu
  4. lnav - Pogledajte i analizirajte zapise Apachea s Linux terminala

To je za sada. Upotrijebite donju povratnu informaciju za postavljanje pitanja ili dodavanje mišljenja o ovoj temi.