journalctl — čitanje sistemskih logova

Kad servis ne startuje, kad sistem puca bez objašnjenja ili kad hoćeš da vidiš šta se dešavalo u tri ujutru — odgovor je u logovima. Na modernim Linux sistemima njima upravlja systemd-journald, a čitaju se komandom journalctl.

Za razliku od starih tekstualnih logova, journal je binarni format sa indeksima. To znači da ne možeš da ga otvoriš običnim cat-om, ali zauzvrat dobijaš filtriranje koje sa grep-om ne bi ni pokušao.

Prvi pogled

# journalctl

Ispisuje ceo journal od najstarijeg zapisa, u pageru. Na sistemu koji radi mesecima to su stotine hiljada linija, pa je ovako praktički neupotrebljivo — ali je dobar način da vidiš kako zapis izgleda:

Aug 19 11:04:23 web01 systemd[1]: Starting The Apache HTTP Server...
Aug 19 11:04:23 web01 httpd[1382]: Server configured, listening on: port 80
Aug 19 11:04:23 web01 systemd[1]: Started The Apache HTTP Server.

Svaki red ima vreme, ime računara, ime procesa sa PID-om i poruku.

Bez sudo videćeš samo deo zapisa — one koje je proizveo tvoj korisnik. Za sistemske logove trebaju ti administratorska prava, ili članstvo u grupi systemd-journal.

Tri opcije koje ćeš koristiti stalno

Od kraja (-e)

# journalctl -e

Otvara journal na poslednjem zapisu. Skoro uvek te zanima kraj, ne početak.

Poslednjih N redova (-n)

# journalctl -n 50

Bez broja podrazumeva se 10.

Praćenje uživo (-f)

# journalctl -f

Ostaje otvoreno i ispisuje nove zapise čim se pojave. Isto kao tail -f. Pokreni ovo u jednom terminalu, pa u drugom restartuj servis — videćeš tačno šta se dešava. Izlaz je Ctrl+C.

Filtriranje po servisu

Ovo je najvažnija stvar u celom tekstu. Umesto da tražiš iglu u plastu:

# journalctl -u httpd

Prikazuje samo zapise koje je proizveo taj servis. Kombinuj sa gornjim opcijama — ovo je oblik koji ćeš najčešće kucati:

# journalctl -u httpd -n 50 --no-pager

Ili, dok testiraš konfiguraciju:

# journalctl -u httpd -f

Više servisa odjednom:

# journalctl -u httpd -u mariadb

Ime servisa je isto ono koje koristiš uz systemctl. Ako nisi siguran kako se tačno zove:

# systemctl list-units --type=service

Filtriranje po vremenu

# journalctl --since "2026-08-19 09:00:00"
# journalctl --since "2026-08-19" --until "2026-08-20"

Ali journalctl razume i ljudski zapis, što je mnogo praktičnije:

# journalctl --since today
# journalctl --since yesterday --until today
# journalctl --since "1 hour ago"
# journalctl --since "30 min ago"
# journalctl --since "2 days ago" -u sshd

Kada ti neko kaže „palo je oko podneva", ovo je komanda:

# journalctl --since "11:45" --until "12:15"

Filtriranje po ozbiljnosti

Svaki zapis ima prioritet, od 0 do 7:

BrojNazivZnačenje
0emergsistem je neupotrebljiv
1alertpotrebna hitna reakcija
2critkritično stanje
3errgreška
4warningupozorenje
5noticeznačajno, ali normalno
6infoinformativno
7debugdetalji za razvoj

Opcija -p prikazuje zadati nivo i sve ozbiljnije od njega:

# journalctl -p err

Ovo je odlična prva komanda kad ti neko kaže „nešto ne radi, a ne znam šta". Suzi na današnji dan i imaš vrlo kratak spisak:

# journalctl -p err --since today

Logovi prethodnog butovanja

Kad se server iznenada restartuje, zanima te šta je bilo pre pada — a taj log je u prethodnom butu.

$ journalctl --list-boots
 0 a1b2c3... Wed 2026-08-19 08:12:04 CEST—Fri 2026-08-21 10:33:17 CEST
-1 d4e5f6... Mon 2026-08-17 19:45:11 CEST—Wed 2026-08-19 08:11:52 CEST
-2 g7h8i9... Sat 2026-08-15 12:03:44 CEST—Mon 2026-08-17 19:44:58 CEST

Nula je trenutni but, -1 prethodni i tako unazad:

# journalctl -b        # trenutni but
# journalctl -b -1     # prethodni but
# journalctl -b -1 -p err

Važno: ovo radi samo ako je journal trajan. Kod podrazumevanog podešavanja na mnogim sistemima journal živi u memoriji i briše se pri restartu — pa tvog prethodnog buta nema. Kako to popraviti, u sekciji o trajnom čuvanju.

Ostali korisni filteri

Po korisniku:

# journalctl _UID=1000

Po programu, kad te zanima izvršni fajl a ne systemd servis:

# journalctl /usr/sbin/sshd

Po kernelu — poruke o hardveru, diskovima, mreži:

# journalctl -k
# journalctl -k -b -1

Filteri se slobodno kombinuju. Sve greške SSH servisa u poslednja tri dana:

# journalctl -u sshd -p err --since "3 days ago"

Format ispisa

Kad ti treba svaki detalj o zapisu — a ne samo poruka:

# journalctl -u httpd -n 1 -o verbose

Dobićeš sva polja, uključujući PID, korisnika, izvršni fajl i _SYSTEMD_UNIT. Odatle i vidiš po čemu sve možeš da filtriraš.

Za dalju obradu skriptom ili slanje u neki sistem za analizu:

# journalctl -u httpd -o json-pretty

A da ispis ide pravo u terminal bez pagera, što ti treba kad prosleđuješ izlaz:

# journalctl -u httpd --no-pager | grep -i timeout

Koliko journal zauzima i kako se čisti

$ journalctl --disk-usage
Archived and active journals take up 2.1G in the file system.

Brisanje po veličini ili starosti:

# journalctl --vacuum-size=500M
# journalctl --vacuum-time=30d

Ako ti se disk puni, journal je jedan od prvih kandidata koje treba proveriti — uz du nad /var/log.

Trajno čuvanje journal-a

Podrazumevano na nekim distribucijama journal se drži u /run/log/journal, dakle u memoriji, i nestaje pri svakom restartu. Za server to nije prihvatljivo.

Proveri stanje:

$ ls /var/log/journal
ls: cannot access '/var/log/journal': No such file or directory

Ako direktorijum ne postoji, journal nije trajan. Uključi ga:

# mkdir -p /var/log/journal
# systemd-tmpfiles --create --prefix /var/log/journal
# systemctl restart systemd-journald

Ili eksplicitno, kroz /etc/systemd/journald.conf — pronađi red #Storage=auto, ukloni # i postavi:

Storage=persistent
SystemMaxUse=1G

pa restartuj systemd-journald. Druga linija ograničava journal na jedan gigabajt, da ti ne pojede disk.

Šta je sa /var/log?

Journal nije zamenio sve. Servisi koji pišu sopstvene logove i dalje to rade — Apache u /var/log/httpd/, a na sistemima sa rsyslog-om i dalje postoje /var/log/messages i /var/log/secure.

Praktično pravilo: sve što je pokrenuto preko systemd-a traži u journal-u; logove same aplikacije traži u /var/log/, i tamo koriste tail, grep i less.

Tri komande za pamćenje

Ako iz celog teksta zapamtiš samo ovo, biće dovoljno u 90% slučajeva:

# journalctl -u ime-servisa -n 50    # zašto servis ne radi
# journalctl -p err --since today    # šta je danas puklo
# journalctl -u ime-servisa -f       # praćenje dok testiraš

Povezano: systemctl · Proces butovanja Linuxa · tail · Administracija i servisi

Comments

Popular posts from this blog

Početak u Linuxu — šta je i zašto se uči

Konverzija tipova podataka u Pythonu

groupadd