8.8 Logfájlok kezelése
Bár az előző fejezetben megismert journalctl a modern systemd-alapú naplózás királya, a Linux-rendszergazdák mindennapi munkája során kikerülhetetlen a hagyományos, szöveges logfájlok kezelése is. Számos kritikus szoftver – például az Apache vagy Nginx webszerverek, az adatbázisok, vagy a helyben futtatott nagy nyelvi modell (LLM) környezetek – a mai napig saját, dedikált szövegfájlokba írják a naplóikat (általában a /var/log/ könyvtárba).
Ha egy ilyen szöveges logfájl mérete eléri a több gigabájtot, a grafikus szövegszerkesztők (vagy akár egy meggondolatlanul kiadott cat parancs) teljesen megfektethetik a rendszert, mivel megpróbálják a teljes fájlt egyszerre betölteni a memóriába.
Ebben az alfejezetben megtanuljuk, hogyan fésülhetjük át a gigászi méretű naplófájlokat másodpercek alatt, memóriaigény nélkül, a head, tail és less parancsok segítségével, és hogyan találhatjuk meg a konkrét hibaüzeneteket a grep szűrővel kombinálva.
8.8.1 A fájlok eleje és vége: head és tail
Amikor egy hibát keresel, leggyakrabban a legfrissebb eseményekre vagy kíváncsi (amik a fájl legvégén vannak), vagy épp ellenkezőleg: egy logfájl fejlécére és struktúrájára (ami a legeslegelején található). A head (fej) és a tail (farok) parancsok pontosan erre szolgálnak: ahelyett, hogy megnyitnák a fájlt, csak egy meghatározott számú sort vágnak ki belőle.
A head parancs (a fájl eleje)
Alapértelmezés szerint a head parancs egy szövegfájl első 10 sorát mutatja meg.
head /var/log/nginx/access.log
Ha több vagy kevesebb sorra van szükséged, a -n kapcsoló után megadhatod a kívánt sorszámot:
head -n 5 /var/log/nginx/access.log
A tail parancs (a fájl vége)
A tail a head tökéletes ellentéte: alapértelmezetten a fájl utolsó 10 sorát vágja ki. Ez sokkal hasznosabb a hibakeresésnél, hiszen a legújabb logbejegyzések mindig a fájl végére fűződnek hozzá.
tail /var/log/nginx/error.log
A sorszámot itt is tetszőlegesen testre szabhatod:
tail -n 25 /var/log/nginx/error.log
8.8.2 Valós idejű logfigyelés: tail -f
A rendszergazdák egyik legtöbbet használt fegyvere a tail parancs -f (follow - követés) kapcsolója. Ez a parancs nem tér vissza a promptthoz, hanem nyitva hagyja a fájlt a terminálban, és élőben, valós időben írja ki a képernyőre az újonnan érkező sorokat.
tail -f /var/log/nginx/access.log
Amint egy látogató megnyitja a webáruházadat, vagy egy belső folyamat hibát generál, a hozzá tartozó sor a képernyődön terem. Ez felbecsülhetetlen segítség, amikor tesztelsz egy futó alkalmazást, és látni akarod, hogyan reagál a gombnyomásaidra. A követő módból a Ctrl + C billentyűkombinációval tudsz kilépni.
Profi tipp: Ha a logfájlt esetleg rotálja (újraírja, lecseréli) a rendszer a háttérben, a sima
-felveszítheti a fonalat. Ilyenkor a-F(nagy F) kapcsolót érdemes használni, ami akkor is tovább követi a fájlt, ha azt törölték és újra létrehozták.
8.8.3 Nagy logok gyors böngészése memóriaigény nélkül: less
Mi van akkor, ha nem csak az elejére vagy a végére vagy kíváncsi, hanem interaktívan bele akarsz lapozni egy 50 Gigabájtos logfájlba, keresni akarsz benne, de nem akarod, hogy a rendszered elfogyassza az összes RAM-ot?
Erre a célra fejlesztették ki a less parancsot. A less egy zseniális szövegmegjelenítő (pager). Titka abban rejlik, hogy nem tölti be a fájlt a memóriába. Ha megnyitsz vele egy óriási fájlt, az azonnal megnyílik, mert a less mindig csak azt a néhány tucat sort olvassa be a lemezről, ami éppen elfér a monitorodon.
sudo less /var/log/cron
Navigáció a less felületén:
- Nyilak / Page Up / Page Down: Soronkénti vagy oldalinkénti görgetés.
G(nagy G): Azonnal a fájl végére ugrik (nagyon hasznos logoknál).g(kis g): Azonnal a fájl elejére ugrik.q: Kilépés a programból és visszatérés a terminálhoz.
Keresés a less-en belül:
Nem kell végiggörgetned a fájlt, ha egy konkrét kifejezést keresel. A less beépített keresővel rendelkezik:
- Nyomd meg a
/(perjel) billentyűt. A képernyő alján megjelenik egy kurzor. - Gépeld be a keresett szót (pl.
errorvagyvivid), majd nyomjEnter-t. - A találatok között a
nbillentyűvel lépkedhetsz előre (Next), aN(Shift + n) billentyűvel pedig visszafelé.
8.8.4 Logok villámgyors szűrése grep-pel
Gyakran előfordul, hogy egy logfájlban percenként több ezer sor keletkezik, és téged ebből a tengerből kizárólag a kritikus hibák, vagy egy konkrét IP-címhez tartozó műveletek érdekelnek. A korábban (a 4. fejezetben) megismert grep parancs a csővezetékkel (|) kombinálva itt válik igazi szuperfegyverré.
1. Konkrét kifejezések kiszűrése fájlból
Keressük meg az összes olyan sort a rendszernaplóban, ami tartalmazza a "failed" (sikertelen) szót:
sudo grep "failed" /var/log/messages
Ha nem vagy biztos benne, hogy a hibaüzenet kis- vagy nagybetűvel lett írva (Failed, FAILED, failed), kényszerítsd a grep-et kis- és nagybetű független módra az -i kapcsolóval:
sudo grep -i "failed" /var/log/messages
2. Élő logfolyam szűrése
Összekapcsolhatjuk a valós idejű követést a grep szűrőjével. Ha elindítod az alábbi parancsot, a képernyőd tiszta marad, és kizárólag akkor villan fel egy új sor, ha abban felbukkan a "CRITICAL" vagy "ERROR" szó:
tail -f /var/log/myapp.log | grep --line-buffered -E "CRITICAL|ERROR"
(A --line-buffered kapcsoló biztosítja, hogy a grep azonnal kitegye a sort a képernyőre, amint az megérkezik, a -E pedig lehetővé teszi a több szavas | vagy-kapcsolat használatát).
3. Környezet megjelenítése: Mi történt a hiba előtt és után?
Egy hibaüzenet önmagában gyakran semmitmondó (pl. NullPointerException). A javításhoz látnod kell, hogy milyen műveletek vezettek el a hibáig. A grep képes kivágni a találat körüli sorokat is:
-B 3(Before): Megmutatja a találat feletti (előtti) 3 sort is.-A 5(After): Megmutatja a találat alatti (utáni) 5 sort is.
grep -B 3 -A 5 "Database connection lost" /var/log/syslog
Ez a parancs tökéletes kontextust ad a kezedbe: pontosan látni fogod, mit csinált a rendszer közvetlenül azelőtt, hogy az adatbázis-kapcsolat megszakadt volna.