Hur man använder journalctl för att läsa Linux-systemloggar

Linux-systemloggningen ändrades med introduktionen av systemd. Lär dig hur du använder kommandot journalctl för att läsa och filtrera systemloggmeddelanden.

Centraliserad loggning

Inte främmande för kontroverser, systemd system- och servicehanteraren införde en betydande förändring i hur systemloggar samlas in. Loggar brukade finnas på olika platser i filsystemet beroende på tjänsten eller demonen som skapade dem. Men de hade alla en sak gemensamt. De var vanliga textfiler.

Med systemd samlas alla system-, start- och kärnloggfiler in och hanteras av en central, dedikerad loggningslösning. Formatet de lagras i är binärt. En sak detta underlättar är att kunna extrahera datan i olika format, som t.ex JSONsom vi ska se.

det kan också göra det lättare att korsreferens relaterad information som tidigare skulle ha registrerats i separata loggfiler. Eftersom data nu lagras i en enda journal kan data från flera intressekällor väljas och visas i en enda sammanvävd lista med poster.

journalctl är verktyget brukade arbeta med journalen.

journalctl utan krusiduller

Du kan anropa journalctl utan kommandoradsparametrar:

journalctl

journalctl visar hela journalen, med de äldsta posterna överst i listan. Listan visas i mindre, vilket gör att du kan bläddra och söka med de vanliga navigeringsfunktionerna för mindre. Du kan också använda vänsterpil och högerpil för att bläddra i sidled för att läsa breda loggposter.

Genom att trycka på End-tangenten hoppar du direkt till botten av listan och de senaste loggposterna.

Tryck på Ctrl+C för att avsluta.

Även om journalctl kan anropas utan att använda sudo, du kommer att se till att du ser alla detaljer i loggen om du använder sudo.

sudo journalctl

Om du behöver kan du få journalctl att skicka sin utdata till terminalfönstret istället för till mindre, genom att använda alternativet –no-pager.

sudo journalctl --no-pager

Utdata rullar snabbt genom terminalfönstret och du återgår till kommandotolken.

För att begränsa antalet rader som journalctl returnerar, använd alternativet -n (rader). Låt oss be om tio rader med utdata:

sudo journalctl -n 10

Efter journaluppdateringar

För att få journalctl att visa de senaste posterna när de kommer till journalen, använd alternativet -f (följ).

sudo journalctl -f

Den senaste posten har en tidsstämpel på 07:09:07. När ny aktivitet äger rum, läggs de nya posterna till längst ner på displayen. Nästan realtidsuppdateringar – coolt!

Klockan 07:09:59 injicerade en applikation som heter geek-app en loggpost i journalen som sa ”Nytt meddelande från HTG.”

Ändra visningsformat

Eftersom journalen är en binär fil måste data i den översättas eller tolkas till text innan den kan visas för dig. Med olika tolkare kan olika utdataformat skapas från samma binära källdata. Det finns flera olika format som journalctl kan använda.

Standardutgången är det korta formatet, som är mycket likt det klassiska systemloggformatet. För att uttryckligen begära det korta formatet, använd alternativet -o (utgång) med den korta modifieraren.

sudo journalctl -n 10 -o short-full

Från vänster till höger är fälten:

Tiden då meddelandet skapades, i lokal tid.
Värdnamnet.
Processens namn. Detta är processen som genererade meddelandet.
Loggmeddelandet.

För att få en fullständig datum- och tidsstämpel använd kort-full modifierare:

sudo journalctl -n 10 -o short-full

Datum- och tidsformaten i den här utgången är det format i vilket du behöver ange datum och tider när du väljer loggmeddelanden efter period, som vi kommer att se inom kort.

För att se all metadata som följer med varje loggmeddelande, använd den utförliga modifieraren.

sudo journalctl -n 10 -o verbose

där finns många möjliga områdenmen det är sällsynt att alla fält finns i ett meddelande.

Ett område som är värt att diskutera är fältet Prioritet. I det här exemplet har det värdet 6. Värdet representerar vikten av meddelandet:

0: Nödsituation. Systemet är oanvändbart.
1: Varning. Ett tillstånd har flaggats som bör korrigeras omedelbart.
2: Kritisk. Detta täcker krascher, coredumps och betydande fel i primära applikationer.
3: Fel. Ett fel har rapporterats, men det anses inte vara allvarligt.
4: Varning. Uppmärksammar dig på ett tillstånd som, om det ignoreras, kan bli ett fel.
5: Observera. Används för att rapportera händelser som är ovanliga, men inte fel.
6: Information. Regelbundna driftmeddelanden. Dessa kräver inga åtgärder.
7: Felsök. Meddelanden läggs in i applikationer för att göra det lättare för dem att felsöka dem.

Om du vill att utdata ska presenteras som korrekt format JavaScript-objektnotation (JSON)-objekt, använd json-modifieraren:

sudo journalctl -n 10 -o json

Varje meddelande är korrekt inslaget som ett välformat JSON-objekt och visas ett meddelande per utdatarad.

För att ha JSON-utgången snyggt trycktanvänd modifieraren json-pretty.

sudo journalctl -n 10 -o json-pretty

Varje JSON-objekt är uppdelat över flera rader, med varje namn-värdepar på en ny rad.

För att bara se loggpostmeddelandena, utan tidsstämplar eller annan metadata, använd kattmodifieraren:

sudo journalctl -n 10 -o cat

Detta visningsformat kan göra det svårt att identifiera vilken process som ledde till logghändelsen, även om vissa meddelanden innehåller en ledtråd.

Välja loggmeddelanden efter tidsperiod

För att begränsa utdata från journalctl till en tidsperiod du är intresserad av, använd alternativen -S (sedan) och -U (tills).

För att se loggposterna sedan en viss tid och ett visst datum, använd det här kommandot:

sudo journalctl -S "2020-91-12 07:00:00"

sudo journalctl -S

Displayen innehåller endast meddelanden som kommit efter datum och tid i kommandot.

Utdata från sudo journalctl -S

För att definiera en tidsperiod som du vill rapportera om, använd både -S (sedan) och -U (tills) alternativen tillsammans. Detta kommando tittar på loggmeddelanden från en 15 minuters tidsperiod.:

sudo journalctl -S "2020-91-12 07:00:00" -U "2020-91-12 07:15:00"

sudo journalctl -S

Detta är en bra kombination om du vet att något konstigt hände på ditt system, och ungefär när det hände.

utdata från sudo journalctl -S

Använda relativa tidsperioder

Du kan använda relativ adressering när du väljer dina tidsperioder. Det betyder att du kan säga saker som ”visa mig alla händelser från en dag sedan till nu.” Detta är precis vad detta kommando betyder. ”d” står för ”dag” och ”-1” betyder en dag i det förflutna.

sudo journalctl -S -1d

Loggmeddelandena listas från 00:00:00 igår fram till ”nu”.

Om du vill undersöka något som hänt i det senaste förflutna kan du ange en relativ tidsperiod mätt i timmar. Här granskar vi loggmeddelanden från den senaste timmen:

sudo journalctl -S -1h

Meddelanden från den senaste timmen visas för dig. Du kan också använda ”m” för att ställa in relativa tidsperioder mätt i minuter och ”w” för veckor.

journalctl förstår idag, igår och imorgon. Dessa modifierare är ett praktiskt sätt att ange vanliga tidsperioder. För att se alla händelser som hände igår, använd det här kommandot:

sudo journalctl -S yesterday

Alla journallogghändelser som hände igår, fram till midnatt 00:00:00, hämtas och visas för dig.

Använd det här kommandot för att se alla loggmeddelanden som mottagits idag hittills:

sudo journalctl -S today

Allt från 00:00:00 fram till det att kommandot ges, visas.

Du kan blanda de olika tidsperiodmodifierarna. För att se allt från två dagar sedan fram till början av idag, använd det här kommandot:

sudo journalctl -S -2d -U today

Allt sedan i förrgår fram till idag hämtas och visas.

Välja loggmeddelanden efter datafält

Du kan söka efter loggmeddelanden som matchar ett brett spektrum av tidskriftsfält. Dessa sökningar försöker hitta matchningar i metadata som bifogas varje meddelande. Det rekommenderas att du se listan över fält och välj de som är mest användbara för dig.

Tänk på att om en ansökan fyller i alla fält eller inte är helt upp till författarna av ansökan. Du kan inte garantera att alla fält kommer att fyllas i.

Alla journalfältsmodifierare används på samma sätt. Vi kommer att använda några i våra exempel nedan. Använd modifieraren _COMM (kommando) för att leta efter loggmeddelanden från ett specifikt program. Om du också använder alternativet -f (följ), kommer journalctl att spåra nya meddelanden från denna applikation när de anländer.

sudo journalctl -f _COMM=geek-app

Du kan söka efter loggposter med hjälp av process-ID av processen som genererade loggmeddelandet. Använd kommandot ps för att hitta process-id:t för demonen eller programmet du ska söka efter.

sudo journalctl _PID=751

På maskinen som används för att undersöka den här artikeln SSH daemon är process 751.

Du kan också söka efter användar ID. Detta är användar-ID för personen som startade programmet eller kommandot, eller som äger processen.

sudo journalctl _UID=1000

Alla meddelanden som är kopplade till andra användar-ID:n filtreras bort. Endast meddelanden relaterade till användare 1000 visas:

Ett annat sätt att söka efter loggmeddelanden relaterade till en specifik applikation är att ange sökvägen till den körbara filen.

sudo journalctl /usr/bin/anacron

Alla anakron Schemaläggarens loggmeddelanden hämtas och visas.

För att göra sökningen enklare kan vi be journalctl att lista alla värden den innehåller, för något av journalfälten.

För att se användar-ID:n som journalctl har registrerat loggmeddelanden för, använd alternativet -F (fält) och skicka fältidentifieraren _UID.

journalctl -F _UID

Låt oss göra det igen och titta på grupp-ID:n (GID:n):

journalctl -F _GID

Du kan göra detta med vilken som helst av journalfältidentifierare.

Lista kärnmeddelanden

Det finns ett inbyggt sätt att snabbt isolera kärnmeddelanden. Du behöver inte söka och isolera dem själv. Alternativet -k (kärna) tar bort alla andra meddelanden och ger dig en omedelbar vy över kärnans loggposter.

sudo journalctl -k

Markeringen speglar vikten av meddelandet, enligt värdena i fältet Prioritet.

Granska startmeddelanden

Om du har ett problem relaterat till uppstart som du vill undersöka, har journalctl dig täckt. Kanske har du lagt till ny hårdvara, och den svarar inte, eller så fungerar en tidigare fungerande hårdvarukomponent inte längre efter din senaste systemuppgradering.

För att se loggposterna relaterade till din senaste start, använd alternativet -b (boot):

journalctl -b

Loggposterna för den senaste uppstarten visas för dig.

När vi säger ”senaste uppstart” menar vi startprocessen som väckte din dator till liv för din nuvarande inloggade session. För att se tidigare startar kan du använda ett nummer för att tala om för journalctl vilken start du är intresserad av. För att se den tredje föregående start, använd det här kommandot:

journalctl -b 3

I allmänhet, om du har haft ett problem och var tvungen att starta om din maskin, är det en tidigare startsekvens du är intresserad av. Så detta är en vanlig kommandoform.

Det är lätt att blandas ihop med sekvensen av stövlar. Som hjälp kan vi be journalctl att lista de stövlar som den har registrerat i sin journal med alternativet –list-boots.

journalctl --list-boots

Du kan identifiera den start du vill se meddelanden för från datum- och tidsstämpeln och sedan använda numret i den vänstra kolumnen för att få loggmeddelanden för den startsekvensen. Du kan också välja 32-bitars startidentifierare och skicka den till journalctl.

sudo journalctl -b 1f00248226ed4ab9a1abac86e0d540d7

Loggmeddelandena från startsekvensen vi begärde hämtas och visas.

Hantera journalhårddiskutrymme

Naturligtvis lagras journalen och alla dess loggmeddelanden på din hårddisk. Det betyder att de kommer att ta upp hårddiskutrymme. För att se hur mycket utrymme som har tagits av journalen, använd alternativet –diskanvändning.

journalctl --disk-usage

Med dagens hårddiskar är 152 MB inte mycket utrymme alls, men för demonstrationsändamål kommer vi ändå att trimma tillbaka det. Det finns två sätt vi kan göra det här. Det första är att sätta en storleksgräns som du vill ha journalen reducerad tillbaka till. Det kommer naturligtvis att växa igen, men vi kan beskära det nu redo för den nya tillväxten.

Vi kommer att använda den underbara titeln -vacuum-size-alternativet och skicka in den storlek vi vill att tidskriften ska reduceras till. Vi ber om 100 MB. Sättet att tänka på detta är att vi ber journalctl att ”slänga allt du kan, men gå inte lägre än 100 MB.”

journalctl --vacuum-size=100M

Det andra sättet att minska journalstorleken är att använda alternativet –vakuumtid. Det här alternativet säger åt journalctl att kassera meddelanden som är äldre än den period du anger på kommandoraden. Du kan använda dagar, veckor, månader och år i tidsperioden.

Låt oss sålla bort alla meddelanden som är äldre än en vecka:

journalctl --vacuum-time=1weeks

Data kontra information

Data är inte användbart om du inte kan komma åt det och använda det. Då blir det användbar information. Kommandot journalctl är ett flexibelt och sofistikerat verktyg som låter dig komma till den intressanta informationen på en mängd olika sätt.

Du kan använda nästan vilken informationsbit du har för att komma in i de loggmeddelanden du behöver.