Jo­ur­nalc­tl je učin­ko­vi­ta rešitev za upra­vlja­nje in analizo sis­tem­skih dnevnikov v okolju Linux. To orodje se lahko uporablja za spre­mlja­nje sis­tem­skih de­jav­no­sti, od­pra­vlja­nje napak in spre­mlja­nje dnevnikov v realnem času, pri čemer za­go­ta­vlja ključne in­for­ma­ci­je za učin­ko­vi­to di­a­gno­sti­ci­ra­nje sis­tem­skih težav.

Kaj je Jo­ur­nalc­tl?

journalctl je zmogljivo orodje za po­i­zve­do­va­nje in pri­ka­zo­va­nje dnevnikov dogodkov ali dnev­ni­ških datotek v sistemu Linux. Je osrednji del paketa za upra­vlja­nje sistema in storitev systemd, ki je vključen v številne sodobne di­s­tri­bu­ci­je Linuxa, kot so Ubuntu, Fedora in Arch Linux. Ime »jo­ur­nalc­tl« je se­sta­vlje­no iz besed »journal« (dnevnik) in »ctl« (nadzor), kar nakazuje, da se ukaz uporablja za nadzor in analizo dnevnikov.

journalctl olajša dostop do sis­tem­ske­ga dnevnika, ki ga upravlja systemd-journald. Sistemski dnevnik je cen­tra­li­zi­ra­na zbirka sporočil in dogodkov, ki se pojavijo med de­lo­va­njem sistema Linux. Za razliko od tra­di­ci­o­nal­nih be­se­dil­nih dnevnikov journalctl omogoča struk­tu­ri­ran in učinkovit način iskanja, fil­tri­ra­nja in pri­ka­zo­va­nja podatkov dnevnika v realnem času. To lahko pomaga pri di­a­gno­sti­ci­ra­nju težav ali spre­mlja­nju stanja sistema.

V ta namen Jo­ur­nalc­tl shranjuje dnevniške datoteke v binarnem formatu, saj so binarne dnevniške datoteke bolj kompaktne in učin­ko­vi­te kot njihove besedilne različice. Glede na veliko količino za­be­le­že­nih podatkov to omogoča hitrejše in učin­ko­vi­tej­še iskanje po­sa­me­znih dogodkov ali in­for­ma­cij v dnev­ni­ških datotekah. Zaradi svoje struk­tu­ri­ra­ne in šifrirane narave binarne dnevniške datoteke v pri­mer­ja­vi z be­se­dil­ni­mi dnevniki za­go­ta­vlja­jo tudi večjo varnost, saj njihov format otežuje ma­ni­pu­la­ci­jo z dnev­ni­ški­mi podatki.

Kako pri­la­go­di­ti prostor za shra­nje­va­nje dnev­ni­ških datotek

journalctl se lahko uporabi za omejitev in na­sta­vi­tev prostora na trdem disku, ki ga zasedajo dnevniške datoteke. To se izvede prek na­sta­vi­tev storitve systemd-journald. Na­sta­vi­tve so shranjene v datoteki /etc/systemd/journald.conf. V njej boste našli naslednje vnose:

  • SystemMaxUse: Omeji prostor za shra­nje­va­nje dnevnikov v sis­tem­skem imeniku
  • RuntimeMaxUse: Omeji prostor za shra­nje­va­nje dnevnikov v začasnem imeniku

Če želite nastaviti omejitev po­mnil­ni­ka, dodajte naslednje vrstice ali jih po potrebi spre­me­ni­te:

[Journal] 
SystemMaxUse=50M 
RuntimeMaxUse=50M
bash

Vrednosti iz tega primera (50M) lahko po potrebi spre­me­ni­te. Uporabite lahko tudi druge enote, kot so K (ki­lo­baj­tov), M (me­ga­baj­tov), G (gi­ga­baj­tov) ali T (te­ra­baj­tov). Ko uredite kon­fi­gu­ra­cij­sko datoteko, je treba za uve­lja­vi­tev sprememb ponovno zagnati program systemd-journald:

sudo systemctl restart systemd-journald
bash

Če sledite tem korakom, bo program systemd-journald na­sta­vljen tako, da bo omejil prostor na disku za datoteke dnevnikov. Pre­pri­čaj­te se, da izbrana omejitev omogoča zadostno shra­nje­va­nje pomembnih podatkov iz dnevnikov. Hkrati je pomembno, da ne porabite preveč prostora na disku. Upo­šte­vaj­te, da se starejši dnevniki samodejno izbrišejo, ko je dosežena omejitev do­de­lje­ne­ga prostora na disku.

Preveri porabo prostora na disku

Preden pri­la­go­di­te prostor za shra­nje­va­nje dnev­ni­ških datotek, preverite, koliko prostora trenutno zaseda dnevnik. Za to uporabite --disk-usage:

journalctl --disk-usage
bash

Tukaj je primer, kako izgleda izpis:

Journals take up 8.0M on disk.
bash

Izbriši stare vpise v dnevniku

Če dnevnik zavzema preveč po­mnil­ni­ka, lahko izbrišete stare vpise v dnevniku. To lahko storite na dva načina:

Uporabite --vacuum-size, da zmanjšate velikost dnevnika tako, da določite želeno velikost. Pri tej metodi se stari vnosi od­stra­nju­je­jo, dokler skupni prostor za shra­nje­va­nje dnevnika na trdem disku ne doseže želene velikosti.

sudo journalctl --vacuum-size=1G
bash

Druga možnost je, da dnevnik skrčite tako, da z možnostjo --vacuum-time nastavite obdobje hrambe. Vnosi, starejši od do­lo­če­ne­ga časa, bodo izbrisani. Če želite ohraniti dnevniške vnose iz pre­te­kle­ga leta, lahko uporabite naslednji ukaz:

sudo journalctl --vacuum-time=1years
bash

Kaj lahko naredi Jo­ur­nalc­tl?

journalctl ponuja zmogljive možnosti fil­tri­ra­nja, ki upo­rab­ni­kom omogočajo pre­gle­do­va­nje vnosov v dnevniku na podlagi različnih meril. Ta funkcija omogoča ciljno iskanje re­le­van­tnih in­for­ma­cij, kar pospeši od­kri­va­nje težav. Tukaj je nekaj pogosto upo­ra­blja­nih možnosti journalctl:

Prikaži dnevnike

Z izvedbo ukaza journalctl se prikažejo vnosi dnevnika za trenutni sistem v obratnem kro­no­lo­škem vrstnem redu. Z ukazoma journalctl -f ali journalctl --follow lahko vnose prikažete v realnem času. Novi vnosi se samodejno prikažejo v vrstnem redu, v katerem prispejo.

Glede na to, kako dolgo sistemd že deluje v vašem sistemu, se bo verjetno prikazala ogromna količina podatkov, ki lahko obsega več deset ali celo več sto tisoč vrstic. Da bi lažje našli tisto, kar iščete, lahko dnevnike dodatno fil­tri­ra­te z raz­lič­ni­mi ukazi v sistemu Linux.

Kako fil­tri­ra­ti po času

Z uporabo journalctl je mogoče dnevnike fil­tri­ra­ti glede na določen časovni trenutek, kar omogoča učin­ko­vi­tej­še iskanje re­le­van­tnih in­for­ma­cij.

Filtriraj po zagonskem procesu

Fil­tri­ra­nje dnevnikov po postopku zagona se izkaže za ne­pre­cen­lji­vo pri pre­u­če­va­nju sis­tem­skih dogodkov v natančno določenih časovnih trenutkih ali med raz­lič­ni­mi scenariji zagona. Ta ciljno usmerjen pristop po­e­no­sta­vi di­a­gno­sti­ci­ra­nje težav, saj dnevniške vpise osre­do­to­či na določene sistemske stanje ali kon­fi­gu­ra­ci­je.

  1. Trenutni zagon: Z journalctl -b se prikažejo vsi vnosi v dnevniku, zbrani od zadnjega ponovnega zagona.
  2. Pretekli zagoni: Uporabite možnost -b, ki ji sledi številka, da prikažete vpise v dnevniku za določen pretekli zagon. Če na primer vnesete journalctl -b 1, se prikaže pretekli zagon.
  3. Seznam vseh raz­po­lo­žlji­vih zagonskih procesov: Ukaz journalctl --list-boots prikaže seznam raz­po­lo­žlji­vih zagonskih procesov z njihovimi ID-ji. Z želenim ID-jem za­gon­ske­ga procesa lahko prikažete dnevnike za določen zagonski proces.

Čeprav je shra­nje­va­nje preteklih zagonskih postopkov v nekaterih di­s­tri­bu­ci­jah Linuxa privzeto omogočeno, ga bodo upo­rab­ni­ki v drugih di­s­tri­bu­ci­jah morda morali najprej vklopiti. Za to ustvarite mapo, v katero se bo dnevnik shra­nje­val, tako da vnesete sudo mkdir -p /var/log/journal. Druga možnost je, da uredite kon­fi­gu­ra­cij­sko datoteko dnevnika s sudo nano /etc/systemd/journald.conf. Nato nastavite možnost Storage= pod [Journal] na persistent, da vklopite trajno beleženje:

. . . 
[Journal] 
Storage=persistent
bash

Filtriraj po časovnem oknu

Včasih je morda potrebno prikazati vpise v dnevniku za določeno časovno obdobje. journalctl ponuja možnosti --since in --until, s katerimi lahko omejite vpise na določeno obdobje. Za to uporabite časovni format YYYY-MM-DD HH:MM:SS. Ukaz za prikaz vseh vpisov v dnevniku med 1. januarjem 2023 ob 12:00 in 2. januarjem 2023 ob 12:00 je naslednji:

journalctl --since "2023-01-01 12:00:00" --until "2023-01-02 12:00:00"
bash

Z zdru­ži­tvi­jo teh dveh ukazov lahko fil­tri­ra­te tudi za krajše časovno obdobje:

journalctl --since 09:00 --until "1 hour ago"
bash

Lahko pa tudi izpustite dele formata. Če na primer želite prikazati vse vnose od do­lo­če­ne­ga časovnega trenutka naprej:

journalctl --since "2023-11-16 15:25:00"
bash

journalctl prepozna tudi relativne vrednosti, kot so yesterday, today ali tomorrow. Če želite prikazati vnose iz vče­raj­šnje­ga dne, vnesite naslednje:

journalctl --since yesterday
bash

Kako fil­tri­ra­ti po zna­čil­no­stih sporočil

Uporaba journalctl za fil­tri­ra­nje dnev­ni­ških vnosov glede na po­memb­nost ali vsebino je prav tako izredno koristna, saj omogoča iskanje re­le­van­tnih in­for­ma­cij in osre­do­to­če­nje na določene vidike sis­tem­skih dnevnikov. To med drugim omogoča učin­ko­vi­to od­kri­va­nje napak, zgodnje za­zna­va­nje var­no­stnih težav in hitro spre­mlja­nje delovanja sistema.

Filtriraj po po­memb­no­sti

Če želite dnevnike s journalctl fil­tri­ra­ti po po­memb­no­sti sporočil, lahko uporabite ka­te­go­ri­je prednosti za vpise v dnevniku. Za to lahko uporabite ime prednosti ali ustrezno številčno vrednost. Nižja kot je številka, po­memb­nej­še je sporočilo:

  • 0: emerg (nujni primer)
  • 1: alert (alarm)
  • 2: krit (kritično)
  • 3: err (napaka)
  • 4: warning (opozorilo)
  • 5: obvestilo (opomba)
  • 6: info (in­for­ma­ci­ja)
  • 7: debug (od­pra­vlja­nje napak)

Sporočila z določeno pri­o­ri­te­to je mogoče fil­tri­ra­ti z uporabo opcije -p. Na primer, naslednji ukaz prikaže le vpise v dnevniku s pri­o­ri­te­to »err« (napaka) ali višjo:

journalctl -p err
bash

Filtriraj po enoti

Fil­tri­ra­nje dnevnikov po enoti je koristno, če se želite osre­do­to­či­ti na določene storitve ali procese. Te lahko fil­tri­ra­te z uporabo možnosti -u. Če želite na primer prikazati vpise v dnevniku za spletni strežnik Apache, vnesite naslednje:

journalctl -u apache2
bash

Iskanje lahko dodatno omejite z uporabo časovnih vrednosti. Če želite ugotoviti, ali je bila storitev danes že opra­vlje­na, vnesite naslednje:

journalctl -u apache2 --since today
bash

journalctl lahko združi zapise podatkov iz različnih enot. Če je na primer vaš proces Nginx povezan z enoto PHP FPM, se lahko njuni zapisi združijo po časovnem zaporedju. Ukaz za to je:

journalctl -u nginx.service -u php-fpm.service --since today-u apache2 --since today
bash

Filtriraj po ID-ju procesa, upo­rab­ni­ka ali skupine

Jo­ur­nalc­tl lahko filtrira vpise v dnevniku po ID-ju procesa, upo­rab­ni­ka ali skupine. Če poznate natančno PID š te vilko procesa, ki ga želite poiskati, lahko za fil­tri­ra­nje vpisov uporabite opcijo _PID. Če je na primer PID 8088, bi ukaz izgledal takole:

journalctl _PID=8088
bash

Poleg tega lahko uporabite filtre _UID ali _GID za prikaz vseh vnosov, ki jih je zabeležil določen uporabnik ali skupina. Če se na primer vaš spletni strežnik imenuje »www-data«, lahko ID upo­rab­ni­ka poiščete tako, da storite naslednje:

id -u www-data
33
bash

Vknjižbe je mogoče fil­tri­ra­ti po iden­ti­fi­ka­cij­ski številki:

journalctl _UID=33 --since today
bash

Če želite ugotoviti, za katere ID-je skupin so bili vnosi ustvar­je­ni, lahko uporabite možnost -F. S tem se prikažejo vse vrednosti, ki so bile shranjene v polju »ID skupine«:

journalctl -F _GID
bash

Tukaj je primer izpisa:

32
99
102
133
81
84
100
0
124
87
bash

Filtriraj po kom­po­nen­ti

Fil­tri­ra­nje po kom­po­nen­ti je koristno za osre­do­to­ča­nje na določene apli­ka­ci­je, storitve ali procese. Polje »kom­po­nen­ta« običajno upo­ra­blja­jo različne storitve ali pro­gram­ske kom­po­nen­te za raz­li­ko­va­nje določenih in­for­ma­cij v dnevnikih. To fil­tri­ra­nje omogoča omejitev vnosov v dnevniku na določeno kom­po­nen­to, apli­ka­ci­jo ali sto­ri­tve­no enoto. Če želite na primer fil­tri­ra­ti vnose, ki vsebujejo iz­ve­dlji­vo datoteko bash, vnesite naslednji ukaz:

journalctl /usr/bin/bash
bash

Prikaži sporočila jedra

Fil­tri­ra­nje dnev­ni­ških vnosov za sporočila jedra s journalctl je učinkovit način za analizo podatkov o delovanju jedra v sistemu Linux. Sporočila jedra lahko na­ka­zu­je­jo težave s strojno opremo, konflikte med gonilniki ali druge sistemske dogodke.

Sporočila jedra, ki jih najdemo v izpisu dmesg, je mogoče fil­tri­ra­ti tudi iz dnevnika. Prikazati jih je mogoče z ukazom `-k or ``:

journalctl -k
bash

Privzeto se pri­ka­zu­je­jo sporočila jedra iz tre­nu­tne­ga za­gon­ske­ga procesa. Sporočila iz al­ter­na­tiv­ne­ga zagona lahko fil­tri­ra­te s pomočjo prej omenjenih zastavic za izbiro zagona. Če želite na primer pre­gle­da­ti sporočila jedra iz zadnjih petih zagonskih procesov, vnesite:

journalctl -k -b -5
bash

Spre­mi­nja­nje prikaza dnevnika v Jo­ur­nalc­tl

Pri­la­ga­ja­nje prikaza v journalctl omogoča upo­rab­ni­kom na­tanč­nej­še iskanje po dnevnikih in hitro pri­do­bi­va­nje in­for­ma­cij. Upo­rab­ni­ki lahko pri­la­go­di­jo prikaz tako, da se podatki iz dnevnikov pri­ka­zu­je­jo za določeno obdobje ali v realnem času, kar olajša hitro od­kri­va­nje sis­tem­skih napak in težav.

Skraj­ša­nje ali po­dalj­ša­nje izhoda

Način pri­ka­zo­va­nja podatkov journalctl lahko pri­la­go­di­te tako, da skrajšate ali razširite izpis. Privzeto journalctl v pagerju prikaže celoten vnos in ga izpiše na desni strani zaslona. Izpis lahko skrajšate z možnostjo --no-full:

journalctl --no-full
bash

Prikaz lahko razširite z uporabo oznake -a:

journalctl -a
bash

Nastavi journalctl na stan­dar­dni izhod

V journalctl se izpis dnevnika privzeto prikaže v obliki, podobni less. To upo­rab­ni­kom omogoča, da si izpis ogle­du­je­jo po delih, kar jim olajša brskanje po obsežnih dnev­ni­ških datotekah. Vendar pa se včasih zgodi, da je potrebno prikazati stan­dar­dni izpis dnevnika. Tako to storite:

journalctl --no-pager
bash

Nastavi izhodne oblike

journalctl ponuja tudi možnosti za pri­la­ga­ja­nje izhodnega formata dnevnikov. Za to lahko uporabite možnost -o z ustreznim iden­ti­fi­ka­tor­jem formata. Če želite na primer izpisati vpise v dnevniku v formatu JSON, vnesite naslednjo kodo:

journalctl -b -u nginx -o json
bash

Tukaj je izpis:

{ "__CURSOR" : "s=13a21661cf4948289c63075db6c25c00;i=116f1;b=81b58db8fd9046ab9f847ddb82a2fa2d;m=19f0daa;t=50e33c33587ae;x=e307daadb4858635", "__REALTIME_TIMESTAMP" : "1422990364739502", "__MONOTONIC_TIMESTAMP" : "27200938", "_BOOT_ID" : "81b58db8fd9046ab9f847ddb82a2fa2d", "PRIORITY" : "6", "_UID" : "0", "_GID" : "0", "_CAP_EFFECTIVE" : "3fffffffff", "_MACHINE_ID" : "752737531a9d1a9c1e3cb52a4ab967ee", "_HOSTNAME" : "desktop", "SYSLOG_FACILITY" : "3", "CODE_FILE" : "src/core/unit.c", "CODE_LINE" : "1402", "CODE_FUNCTION" :
bash

V Jo­ur­nalc­tl je mogoče uporabiti naslednje oblike:

  • cat: Prikaže samo polje za sporočilo
  • export: Binarni format, primeren za prenos ali shra­nje­va­nje
  • json: Stan­dar­dni JSON z enim vnosom na vrstico
  • json-pretty: JSON, oblikovan za boljšo ber­lji­vost
  • json-sse: Obli­ko­va­na izhodna JSON-datoteka, ki omogoča dodajanje dogodkov, poslanih s strežnika
  • short: Stan­dar­dni izpis v slogu syslog
  • short-iso: Stan­dar­dni format za prikaz časovnih žigov po standardu ISO-8601
  • short-monotonic: Stan­dar­dni format z mo­no­to­ni­mi časovnimi oznakami
  • short-precise: Stan­dar­dni format z na­tanč­no­stjo do mi­kro­se­kun­de
  • verbose: Prikaže vsa polja dnevnika, ki so na voljo za zadevni vnos

Kako journalctl izvaja aktivno spre­mlja­nje procesov?

Med aktivnim spre­mlja­njem procesov s journalctl se program za ukazno vrstico tail uporablja za spre­mlja­nje dnevnikov v realnem času in prikaz naj­no­vej­ših vnosov. To olajša spre­mlja­nje sis­tem­skih dogodkov v realnem času in omogoča hiter odziv na težave.

Kako prikazati trenutne dnevnike

Z možnostjo -n lahko prikažete določeno število po­dat­kov­nih zapisov. Deluje popolnoma enako kot tail -n. Če želite prikazati zadnjih 10 vnosov, uporabite naslednji ukaz:

journalctl -n
bash

Prav tako lahko nastavite število vnosov, npr. na 20:

journalctl -n 20
bash
Go to Main Menu