6 modulis · 6.2
Žurnalų skaitymas su journalctl
6 modulis: Paslaugos ir žurnalai · Skaitymo laikas: 11 min.
Mokymosi tikslas: Po šios pamokos galėsite su journalctl tikslingai ieškoti savo serverio žurnaluose (pagal paslaugą, prioritetą ir laiką), žinosite, kur yra kiti žurnalų failai, ir neleisite žurnalams užpildyti disko.
Pagrindinės sąvokos: journald, journal, journalctl -u, -p, --since/--until, -f, -b, -e, -n, prioritetas (err, warning, info), nuolatinis saugojimas, /var/log/journal, --disk-usage, --vacuum-size, /var/log, logrotate, rsyslog
Žurnalas kaip pirmasis liudytojas
Jei kažkas Jūsų serveryje neveikia, priežastis beveik visada yra įrašyta žurnale. Svetainė, rodanti klaidos puslapį, paslauga, kuri nepasileidžia, atsarginė kopija, kuri šiąnakt nebuvo padaryta: serveris visa tai užrašė. Geras administratorius pirmiausia pažiūri į žurnalą ir tik po to ką nors keičia.
Šiuolaikiniuose Linux serveriuose journald (systemd dalis) surenka branduolio, paties systemd ir visų paslaugų pranešimus į vieną žurnalą: journal. Jį skaitote su journalctl.
Kad galėtumėte skaityti viską, turite priklausyti grupei adm arba systemd-journal arba naudoti sudo. Be šių teisių matysite tik savo pranešimus.
Kur jis saugomas? Nuolatinis ar laikinas
journald saugo journal vienoje iš dviejų vietų:
/var/log/journal/: nuolatinis, žurnalai išlieka po paleidimo iš naujo;/run/log/journal/: laikinas, atmintyje, dingsta po paleidimo iš naujo.
Numatytasis nustatymas (Storage=auto faile /etc/systemd/journald.conf) pasirenka nuolatinį saugojimą, jei katalogas /var/log/journal/ egzistuoja. Debian sistemoje systemd paketas šį katalogą sukuria jau nuo Debian 11, Ubuntu jis taip pat yra. Patikrinkite:
anna@web1:~$ ls -d /var/log/journal
/var/log/journal
anna@web1:~$ journalctl --list-boots | tail -n 3
-2 3c1f... Sun 2026-11-01 04:30:12 CET Sun 2026-11-08 04:30:01 CET
-1 9ab7... Sun 2026-11-08 04:30:40 CET Mon 2026-11-09 08:12:05 CET
0 e41d... Mon 2026-11-09 08:12:30 CET Mon 2026-11-09 11:40:17 CETJei matote tik vieną paleidimą, nors serveris jau buvo paleistas iš naujo, Jūsų žurnalai yra laikini. Sukurkite katalogą (sudo mkdir -p /var/log/journal ir sudo systemd-tmpfiles --create --prefix /var/log/journal) ir iš naujo paleiskite journald. Tai svarbu: po strigties norėsite žinoti būtent tai, kas vyko prieš paleidimą iš naujo.
Nuo Debian 12 rsyslog nebėra diegiamas pagal numatytuosius nustatymus. Ši programa anksčiau rašė tekstinius failus, tokius kaip /var/log/syslog ir /var/log/auth.log. Naujame Debian serveryje jų nėra, viskas yra journal. Ubuntu rsyslog vis dar turi. Instrukcijas, kuriose sakoma "žiūrėkite /var/log/auth.log", Debian sistemoje galite pakeisti į journalctl -u ssh.
Paieška: filtrai, kuriuos tikrai naudosite
Be filtro journalctl rodo viską, pradedant nuo seniausio įrašo. Retai to norite. Svarbiausi filtrai, kuriuos galite derinti:
| Filtras | Pavyzdys | Ką daro |
|---|---|---|
-u <unit> | journalctl -u nginx | tik ta paslauga |
-p <prioriteit> | journalctl -p err | tik klaidos ir rimtesni įvykiai |
--since, --until | --since "2026-11-09 03:00" --until "04:00" | laikotarpis; taip pat today, yesterday, "1 hour ago" |
-b | journalctl -b, journalctl -b -1 | nuo šio paleidimo arba ankstesnis paleidimas |
-f | journalctl -u nginx -f | stebėti tiesiogiai (kaip tail -f), sustabdyti su Ctrl+C |
-e | journalctl -u ssh -e | peršokti į pabaigą |
-n | journalctl -u ssh -n 50 | paskutinės 50 eilučių |
-k | journalctl -k | tik branduolio pranešimai |
--no-pager | be puslapiavimo, patogu su grep |
Prioritetai eina nuo 0 (emerg) iki 7 (debug): emerg, alert, crit, err, warning, notice, info, debug. Su -p err gaunate err ir viską, kas rimčiau. -p warning rodo ir įspėjimus.
Tipiškas paieškos kelias. Jūsų svetainė nuo šio ryto rodo klaidą 502:
anna@web1:~$ systemctl status php8.4-fpm
× php8.4-fpm.service - The PHP 8.4 FastCGI Process Manager
Active: failed (Result: exit-code) since Mon 2026-11-09 07:02:11 CET; 4h ago
...
anna@web1:~$ sudo journalctl -u php8.4-fpm --since today -p warning --no-pager
nov 09 07:02:10 web1 php-fpm8.4[1830]: [09-Nov-2026 07:02:10] ERROR: [/etc/php/8.4/fpm/pool.d/www.conf:42] unknown entry 'pm.max_children '
nov 09 07:02:10 web1 php-fpm8.4[1830]: [09-Nov-2026 07:02:10] ERROR: FPM initialization failed
nov 09 07:02:11 web1 systemd[1]: php8.4-fpm.service: Main process exited, code=exited, status=78/CONFIG
nov 09 07:02:11 web1 systemd[1]: php8.4-fpm.service: Failed with result 'exit-code'.Priežastis parašyta pažodžiui: rašybos klaida konfigūracijos failo 42 eilutėje. Būsena 78 (CONFIG) patvirtina, kad tai konfigūracijos klaida. Nieko spėlioti nereikia.
Du patarimai skaitant:
- Skaitykite iš viršaus į apačią ir ieškokite pirmosios klaidos. Viena klaida dažnai sukelia visą seką tolesnių pranešimų. Pirmoji paprastai ir yra priežastis.
- Atkreipkite dėmesį į laiką. Kas pasikeitė apie tą laiką? Automatinis atnaujinimas (pamoka 4.2:
/var/log/unattended-upgrades/), Jūsų atliktas pakeitimas, paleidimas iš naujo?
Kiti žurnalų failai
Ne viskas yra journal. Daug programų taip pat (arba tik) rašo savo failus kataloge /var/log/:
| Failas arba katalogas | Kas jame |
|---|---|
/var/log/nginx/access.log ir error.log | kiekviena nginx užklausa ir klaida |
/var/log/apt/history.log | ką ir kada įdiegė apt |
/var/log/unattended-upgrades/ | automatiniai atnaujinimai (pamoka 4.2) |
/var/log/fail2ban.log | blokavimai (pamoka 5.3) |
/var/log/mysql/ arba journal | MariaDB/MySQL, priklausomai nuo nustatymų |
Didelius tekstinius failus skaitote su less (paieška su /), pabaigą su tail -n 50, tiesiogiai su tail -f, o filtruojate su grep:
anna@web1:~$ sudo grep " 502 " /var/log/nginx/access.log | tail -n 5Docker konteinerių žurnalai yra ne /var/log, o pačiame Docker: docker compose logs (pamoka 9.3).
Žurnalai neturi užpildyti disko
Pilnas diskas yra viena dažniausių priežasčių, kodėl serveris "staiga" nustoja veikti: duomenų bazės sustoja, atnaujinimai nepavyksta, kartais net nebegalite prisijungti. Dažnai kalti būna žurnalai.
Journal pats save riboja. Pagal numatytuosius nustatymus jis naudoja ne daugiau kaip 10% failų sistemos, daugiausia 4 GB (SystemMaxUse=). Kiek jis naudoja dabar ir kaip išvalyti:
anna@web1:~$ journalctl --disk-usage
Archived and active journals take up 512.0M in the file system.
anna@web1:~$ sudo journalctl --vacuum-time=30d # senesni nei 30 dienų šalinami
anna@web1:~$ sudo journalctl --vacuum-size=500M # iki 500 MBJei norite fiksuotos ribos, įrašykite ją į drop-in failą /etc/systemd/journald.conf.d/grootte.conf:
[Journal]
SystemMaxUse=1Gir iš naujo paleiskite journald su sudo systemctl restart systemd-journald.
Tekstinius failus kataloge /var/log prižiūri logrotate: kiekvieną dieną ar savaitę failas pervadinamas (error.log.1), senesnės versijos suspaudžiamos (.gz), o seniausios ištrinamos. Kiekvienos programos taisyklės yra /etc/logrotate.d/. Distribucijos paketai atsineša savo taisykles. Jei Jūsų pačių programa ar scenarijus rašo į atskirą žurnalo failą, sukurkite taisyklę patys, kitaip failas augs be galo.
Kaip rasti, kas užima vietą:
anna@web1:~$ df -h /
anna@web1:~$ sudo du -xh /var/log | sort -h | tail -n 5Žurnalai ir privatumas
Žurnaluose yra IP adresų, naudotojų vardų ir kartais el. pašto adresų: tai asmens duomenys. Nesaugokite jų ilgiau nei reikia (mažam serveriui įprasta nuo kelių savaičių iki kelių mėnesių), nepalikite jų viešai prieinamų (katalogas /logs Jūsų svetainės šakniniame kataloge yra žinoma klaida) ir nekopijuokite jų be priežasties į kitų tiekėjų paslaugas.
AlmaLinux ir Rocky Linux sistemose
journalctl veikia taip pat. Ten rsyslog vis dar įjungtas pagal numatytuosius nustatymus, su tokiais failais kaip /var/log/messages ir /var/log/secure (auth.log atitikmuo). SELinux pranešimai yra /var/log/audit/audit.log; ausearch -m avc -ts recent rodo naujausius atmetimus.
Santrauka
- journald surenka visus pranešimus į journal; skaitykite jį su
journalctl, filtruodami pagal paslaugą (-u), prioritetą (-p), laiką (--since) ir paleidimą (-b). - Patikrinkite, ar journal yra nuolatinis (
/var/log/journalegzistuoja), kitaip po paleidimo iš naujo prarasite žurnalus. - Debian 12 ir naujesnės versijos pagal numatytuosius nustatymus neturi rsyslog, todėl nėra ir
/var/log/auth.logbei/var/log/syslog; viskas yra journal. - Ieškokite pirmosios klaidos ir žiūrėkite, kas pasikeitė apie tą laiką.
- Stebėkite dydį: journal pats save riboja (
--disk-usage,--vacuum-*), tekstinius failus tvarko logrotate.
Testas (quiz)
Užduotis
Užduotis Z6.2: Strigusios paslaugos analizė. Pavyzdiniame faile journal-crash-1.txt yra paslaugos, kuri vis iš naujo pasileidžia ir galiausiai pasiduoda, systemctl status ir journalctl išvestis. Atsakykite: kaip vadinasi paslauga, kiek kartų systemd bandė ją paleisti, kokiu išėjimo kodu ji sustojo, kokia priežastis pagal pirmąjį klaidos pranešimą ir kelintą valandą systemd pasidavė? Programa palygina atsakymus su nustatytu raktu. Po to savo serveryje patikrinkite, ar journalctl -p err -b rodo klaidų ir ar Jūsų journal yra nuolatinis.
Skaitykite daugiau
- Vadovas
journalctl(1): https://manpages.debian.org/trixie/systemd/journalctl.1.en.html - Vadovas
journald.conf(5)(Storage=, SystemMaxUse=): https://manpages.debian.org/trixie/systemd/journald.conf.5.en.html - Debian 12 išleidimo pastabos, 5.1.7 (rsyslog nebėra numatytasis): https://www.debian.org/releases/bookworm/amd64/release-notes/ch-information.en.html
