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

By rik

Utforska systemloggar med journalctl

Med systemd introducerades ett nytt sätt att hantera loggning i Linux. Nu används `journalctl` för att granska och filtrera systemloggmeddelanden. Denna förändring centraliserar logghanteringen och ger mer kraftfulla verktyg för att undersöka vad som händer i systemet.

Centraliserad logghantering

Systemd, som är en system- och servicehanterare, har medfört betydande förändringar i hur systemloggar samlas in. Tidigare var loggfiler spridda på olika platser i filsystemet, beroende på vilken tjänst eller demon som hade genererat dem. Trots olika placeringar, hade de en sak gemensamt: de var vanliga textfiler.

Med systemd samlas alla system-, start- och kärnloggar in och hanteras av en centraliserad loggningslösning. Informationen lagras i ett binärt format. Det här gör det enkelt att exportera loggdata i olika format, exempelvis JSON, som vi ska se senare. Det underlättar också korsreferering av relaterad information som tidigare fanns i separata loggfiler. Nu kan man visa data från flera olika källor i en samlad lista.

Verktyget som används för att interagera med journalen är `journalctl`. Mer information om `journalctl` finns i manualsidan.

Grundläggande användning av journalctl

Du kan köra `journalctl` utan några kommandoradsargument:

journalctl

Detta visar hela journalen, med de äldsta inläggen först. Informationen visas i ”less”, vilket ger dig möjlighet att bläddra och söka. Du kan också bläddra i sidled genom att använda vänster- och högerpilarna för att läsa långa loggposter.

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

Avsluta genom att trycka Ctrl+C.

Även om `journalctl` kan användas utan `sudo`, kommer du se fler detaljer i loggen om du använder `sudo`. Se manualsidan för mer information om `sudo`.

sudo journalctl

Om du vill att `journalctl` ska skicka sin utdata direkt till terminalfönstret istället för ”less”, kan du använda alternativet `–no-pager`.

sudo journalctl --no-pager

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

För att begränsa antalet rader som `journalctl` returnerar, använd alternativet `-n (rader)`. Här ber vi om tio rader med utdata:

sudo journalctl -n 10

Följ logguppdateringar

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 i displayen. Nästan realtidsuppdateringar – praktiskt!

Klockan 07:09:59 injicerade en applikation vid namn ”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 översättas eller tolkas till text innan den kan visas för dig. Med olika tolkar kan olika utdataformat skapas från samma binära källdata. Det finns flera format som `journalctl` kan använda.

Standardutmatningen är det korta formatet, som liknar det traditionella systemloggformatet. För att explicit begära det korta formatet, använd alternativet `-o (utgång)` med modifieraren `short`.

sudo journalctl -n 10 -o short

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 modifieraren `short-full`:

sudo journalctl -n 10 -o short-full

Datum- och tidsformaten i denna utdata är det format du behöver ange när du väljer loggmeddelanden efter period.

För att se all metadata som följer med varje loggmeddelande, använd modifieraren `verbose`.

sudo journalctl -n 10 -o verbose

Det finns många möjliga fält, men det är sällsynt att alla fält finns i ett meddelande. En detaljerad lista över fälten finns här.

Ett fält som är värt att diskutera är ”Prioritet”. I detta exempel har det värdet 6. Värdet representerar vikten av meddelandet:

0: Nödsituation. Systemet är oanvändbart.
1: Varning. Ett tillstånd som bör åtgärdas omedelbart.
2: Kritiskt. Krascher, coredumps och betydande fel i primära applikationer.
3: Fel. Ett fel har rapporterats, men det anses inte vara allvarligt.
4: Varning. Meddelar ett tillstånd som kan bli ett fel om det ignoreras.
5: Observera. Händelser som är ovanliga, men inte fel.
6: Information. Vanliga driftmeddelanden. Dessa kräver inga åtgärder.
7: Felsökning. Meddelanden för att göra det lättare att felsöka applikationer.

Om du vill att utdata ska presenteras som välformaterad JavaScript Object Notation (JSON), använd modifieraren `json`:

sudo journalctl -n 10 -o json

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

För att ha JSON-utmatningen snyggt formaterad, anvä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 endast se loggposternas meddelanden, utan tidsstämplar eller annan metadata, använd modifieraren `cat`:

sudo journalctl -n 10 -o cat

Detta format gör det svårt att identifiera vilken process som orsakade händelsen, men vissa meddelanden kan ge en ledtråd.

Filtrera efter tidsperiod

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

För att se loggposter sedan en specifik tid och datum, använd följande kommando:

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

Displayen innehåller endast meddelanden som har skapats efter datumet och tiden i kommandot.

För att definiera en specifik tidsperiod, använd både `-S (sedan)` och `-U (tills)` tillsammans. Det här kommandot tittar på loggmeddelanden under en 15-minutersperiod:

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

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

Använda relativa tidsperioder

Du kan använda relativa tidsangivelser när du väljer dina tidsperioder. Det betyder att du kan säga saker som ”visa mig alla händelser från igår till nu.” Det är precis vad det här kommandot gör. ”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 nyligen 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 minuter och ”w” för veckor.

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

sudo journalctl -S yesterday

Alla logghä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 kombinera olika tidsperiodmodifierare. 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 journalfält. Du hittar en fullständig lista över fält här. Dessa sökningar matchar metadata som är bifogade till varje meddelande. Välj de fält som är mest användbara för dig.

Tänk på att det är upp till applikationens skapare om applikationen fyller i alla fält. Det finns ingen garanti 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 en specifik applikation. Om du använder alternativet `-f (följ)` kommer `journalctl` att spåra nya meddelanden från den här applikationen när de anländer.

sudo journalctl -f _COMM=geek-app

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

sudo journalctl _PID=751

På den maskin som användes för att undersöka den här artikeln, är SSH-demonen process 751.

Du kan också söka efter användar-ID (UID). Detta är användar-ID:t för den 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 som är relaterade till en specifik applikation är att ange sökvägen till den körbara filen.

sudo journalctl /usr/bin/anacron

Alla anacron-schemaläggarens loggmeddelanden hämtas och visas.

För att göra sökningen enklare kan vi be `journalctl` att lista alla värden som 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 som är relaterat till uppstart som du vill undersöka, kan `journalctl` hjälpa dig. 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 startade din dator för din nuvarande inloggade session. För att se tidigare starter 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 starten, 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