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