Wyszukiwanie w witrynie

Zarządzaj komunikatami dziennika w Systemd za pomocą Journalctl [Kompleksowy przewodnik]


Systemd to najnowocześniejszy menedżer systemów i usług dla systemów Linux: zamiennik demona init, przeznaczony do równoległego uruchamiania procesów podczas uruchamiania systemu. Jest teraz obsługiwany w wielu bieżących dystrybucjach głównego nurtu, w tym Fedora, Debian, Ubuntu, OpenSuSE, Arch, RHEL, CentOS itp.

Wcześniej wyjaśniliśmy historię „init” i „systemd”; gdzie omawialiśmy, czym są te dwa demony, dlaczego z technicznego punktu widzenia „init” należało zastąpić „systemd”, a także główne cechy systemd.

Jedną z głównych zalet systemd w porównaniu z innymi popularnymi systemami init jest obsługa scentralizowanego zarządzania logowaniem systemu i procesów za pomocą dziennika. W tym artykule dowiemy się, jak zarządzać i przeglądać komunikaty dziennika w systemie systemd za pomocą polecenia journalctl w systemie Linux.

Ważne: zanim przejdziesz dalej w tym przewodniku, możesz dowiedzieć się, jak zarządzać usługami i jednostkami „Systemd” za pomocą polecenia „Systemctl”, a także tworzyć i uruchamiać nowe jednostki usług w systemie przy użyciu skryptów powłoki w systemie Linux. Jeśli jednak zgadzasz się ze wszystkimi powyższymi informacjami, czytaj dalej.

Konfigurowanie Journald do zbierania komunikatów dziennika w Systemd

journald to demon zbierający i zapisując wpisy do dziennika z całego systemu; są to zasadniczo komunikaty startowe, komunikaty z jądra i sysloga lub różnych aplikacji, które przechowuje wszystkie komunikaty w centralnej lokalizacji – pliku dziennika.

Możesz kontrolować zachowanie journald poprzez jego domyślny plik konfiguracyjny: /etc/systemd/journald.conf, który jest generowany w czasie kompilacji. Ten plik zawiera opcje, których wartości możesz zmienić, aby dostosować je do wymagań lokalnego środowiska.

Poniżej znajduje się próbka wyglądu pliku, wyświetlona za pomocą polecenia 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

Należy pamiętać, że różne instalacje pakietów i fragmenty konfiguracji użycia w pliku /usr/lib/systemd/*.conf.d/ oraz konfiguracje czasu wykonywania można znaleźć w pliku /run/systemd/journald.conf. d/*.conf, którego niekoniecznie możesz użyć.

Włącz przechowywanie danych dziennika na dysku

Wiele dystrybucji Linuksa, w tym Ubuntu i jego pochodne, takie jak Linux Mint, domyślnie nie umożliwiają trwałego przechowywania komunikatów rozruchowych na dysku.

Można to włączyć, ustawiając opcję „Przechowywanie” na „Trwałe”, jak pokazano poniżej. Spowoduje to utworzenie katalogu /var/log/journal i wszystkie pliki dziennika będą w nim przechowywane.

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

Aby uzyskać dodatkowe ustawienia, znajdź znaczenie wszystkich opcji, które mają zostać skonfigurowane w sekcji „[Dziennik]”, wpisując.

man journald.conf

Ustawianie prawidłowego czasu systemowego za pomocą polecenia Timedatectl

Aby zapewnić niezawodne zarządzanie dziennikami w ramach usługi systemd przy użyciu usługi journald, upewnij się, że ustawienia czasu, w tym strefa czasowa, są prawidłowe w systemie.

Aby wyświetlić aktualne ustawienia daty i godziny w systemie, wpisz.

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

Aby ustawić prawidłową strefę czasową i ewentualnie czas systemowy, użyj poniższych poleceń.

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

Wyświetlanie komunikatów dziennika za pomocą polecenia Journalctl

journalctl to narzędzie używane do przeglądania zawartości dziennika systemowego (który jest pisany przez usługę journald).

Aby wyświetlić wszystkie zebrane logi bez żadnego filtrowania, wpisz.

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 (buildd@lgw01-21)
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

Wyświetl komunikaty dziennika na podstawie butów

Możesz wyświetlić listę numerów rozruchowych (w odniesieniu do bieżącego rozruchu), ich identyfikatory oraz znaczniki czasu pierwszego i ostatniego komunikatu odpowiadającego rozruchowi za pomocą opcji --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 

Aby wyświetlić wpisy dziennika z bieżącego rozruchu (numer 0), użyj przełącznika -b w ten sposób (tak samo jak przykładowe wyjście powyżej).

journalctl -b

i aby zobaczyć dziennik z poprzedniego rozruchu, użyj wskaźnika względnego -1 z opcją -b jak poniżej.

journalctl -b -1

Alternatywnie użyj identyfikatora rozruchu w ten sposób.

journalctl -b 9fb590b48e1242f58c2579defdbbddc9

Filtrowanie komunikatów dziennika na podstawie czasu

Aby używać czasu w formacie uniwersalnego czasu koordynowanego (UTC), dodaj opcje --utc w następujący sposób.

journalctl --utc

Aby zobaczyć wszystkie wpisy od określonej daty i godziny, np.: 15 czerwca 2017 o 8:15 wpisz to polecenie.

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

Przeglądanie ostatnich komunikatów dziennika

Aby wyświetlić najnowsze komunikaty dziennika (domyślnie 10), użyj flagi -n, jak pokazano poniżej.

journalctl -n
journalctl -n 20 

Przeglądanie komunikatów dziennika generowanych przez jądro

Aby zobaczyć tylko komunikaty jądra, podobne do wyników polecenia dmesg, możesz użyć flagi -k.

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

Przeglądanie komunikatów dziennika generowanych przez jednostki

Aby wyświetlić wszystkie wpisy księgowe dla określonej jednostki, użyj przełącznika -u w następujący sposób.

journalctl -u apache2.service

Aby wyzerować do bieżącego rozruchu, wpisz to polecenie.

journalctl -b -u apache2.service

Aby wyświetlić logi z poprzedniego rozruchu, użyj tego.

journalctl -b -1 -u apache2.service

Poniżej znajduje się kilka innych przydatnych poleceń:

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

Wyświetlanie komunikatów dziennika generowanych przez procesy

Aby wyświetlić logi wygenerowane przez konkretny proces, określ jego PID w ten sposób.

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

Wyświetlanie komunikatów dziennika generowanych przez identyfikator użytkownika lub grupy

Aby wyświetlić logi wygenerowane przez określonego użytkownika lub grupę, określ jego identyfikator użytkownika lub grupy w ten sposób.

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

Przeglądanie dzienników generowanych przez plik

Aby wyświetlić wszystkie dzienniki wygenerowane przez plik (prawdopodobnie plik wykonywalny), taki jak plik wykonywalny D-Bus lub pliki wykonywalne bash, po prostu wpisz.

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

Przeglądanie komunikatów dziennika według priorytetu

Możesz także filtrować dane wyjściowe w oparciu o priorytety wiadomości lub zakresy priorytetów, używając flagi -p. Możliwe wartości to: 0 – emerg, 1 – alert, 2 – krytyczny, 3 – err, 4 – ostrzeżenie, 5 – zawiadomienie, 6 – informacja, 7 – debugowanie):

journalctl -p err

Aby określić zakres, użyj poniższego formatu (wyjście do ostrzeżenia).

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

Przeglądaj komunikaty dziennika w czasie rzeczywistym

Możesz praktycznie oglądać logi podczas ich zapisywania za pomocą opcji -f (podobnie jak funkcjonalność tail -f).

journalctl -f

Obsługa formatowania wyświetlania dziennika

Jeśli chcesz kontrolować formatowanie wyjściowe zapisów księgowych, dodaj flagę -o i użyj tych opcji: cat, eksport, json, json-pretty, json-sse, short, short-iso, krótko-monotoniczny, krótki i dokładny (sprawdź znaczenie opcji na stronie podręcznika:

Opcja cat pokazuje rzeczywistą treść każdego wpisu w dzienniku bez żadnych metadanych (sygnatury czasowej itp.).

journalctl -b -u apache2.service -o cat

Zarządzanie czasopismami w systemie

Aby sprawdzić plik dziennika pod kątem wewnętrznej spójności, użyj opcji --verify. Jeśli wszystko jest w porządku, wynik powinien wskazywać PASS.

journalctl --verify

PASS: /run/log/journal/2a5d5f96ef9147c0b35535562b32d0ff/system.journal                               
491f68: Unused data (entry_offset==0)                                                                
PASS: /run/log/journal/2a5d5f96ef9147c0b35535562b32d0ff/system@816533ecd00843c4a877a0a962e124f2-0000000000003184-000551f9866c3d4d.journal
PASS: /run/log/journal/2a5d5f96ef9147c0b35535562b32d0ff/system@816533ecd00843c4a877a0a962e124f2-0000000000001fc8-000551f5d8945a9e.journal
PASS: /run/log/journal/2a5d5f96ef9147c0b35535562b32d0ff/system@816533ecd00843c4a877a0a962e124f2-0000000000000d4f-000551f1becab02f.journal
PASS: /run/log/journal/2a5d5f96ef9147c0b35535562b32d0ff/system@816533ecd00843c4a877a0a962e124f2-0000000000000001-000551f01cfcedff.journal

Usuwanie starych plików dziennika

Możesz także wyświetlić bieżące wykorzystanie dysku przez wszystkie pliki dziennika za pomocą opcji --disk-usage. Pokazuje sumę wykorzystania dysku przez wszystkie zarchiwizowane i aktywne pliki dziennika:

journalctl --disk-usage

Aby usunąć stare (zarchiwizowane) pliki dziennika, uruchom poniższe polecenia:

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

Rotacja plików dziennika

Na koniec możesz poinstruować journald, aby obracał pliki dziennika za pomocą opcji --rotate. Należy pamiętać, że ta dyrektywa nie powraca, dopóki operacja rotacji nie zostanie zakończona:

sudo journalctl --rotate

Aby uzyskać szczegółowy przewodnik użytkowania i opcje, wyświetl stronę podręcznika journalctl w następujący sposób.

man journalctl

Sprawdź kilka przydatnych artykułów.

  1. Zarządzanie procesem i usługami uruchamiania systemu (SysVinit, Systemd i Upstart)
  2. Petiti – narzędzie do analizy logów typu open source dla administratorów systemu Linux
  3. Jak skonfigurować rotację dzienników i zarządzać nimi za pomocą Logrotate w systemie Linux
  4. lnav – Oglądaj i analizuj dzienniki Apache z terminala Linux

To tyle na teraz. Skorzystaj z informacji zwrotnych poniżej, aby zadać pytania lub podzielić się swoimi przemyśleniami na ten temat.