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.
- Upravljanje postupkom pokretanja sustava i uslugama (SysVinit, Systemd i Upstart)
- Petiti - Alat za analizu dnevnika otvorenog koda za Linux SysAdmins
- Kako postaviti i upravljati rotacijom dnevnika pomoću Logrotatea u Linuxu
- 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.