systemd

Master journalctl förstår systemd loggar

Master journalctl förstår systemd loggar
Systemd är det nya verktyget för hantering av tjänster. Ursprungligen skapad av Red Hat, möjliggör det bättre hantering av tjänster via en centraliserad process som övervakar och lanserar tjänster efter behov. Men systemd inkluderar också ett containersystem, ett cron-system, ett sätt att tillhandahålla tillfälliga kataloger till tjänster på ett säkert sätt och också ett loggningssystem - det är där vi ska fokusera här.

Att förstå loggar är viktigt: om du någonsin hamnar på en server som har en bugg eller är hackad, är i allmänhet ditt enda sätt att förstå vad som hände via loggar. Huvudapplikationen vi ska använda är journalctl därav namnet på artikeln. Så lyssna noga som på rätt dag, du kanske är glad att veta hur det fungerar.

Var lagras systemd-loggar? Och vilket format det lagras i?

Vi antar att du har ett normalt system, eftersom systemd kan anpassas för att vara på exceptionella platser. Vissa Linux-distributioner som Ubuntu 16.04 inaktiverade ihållande loggning som standard, vilket förhindrar systemd att göra sitt jobb korrekt. Om du har en sådan distribution, redigera / etc / systemd / journald.conf-fil, ändra Storage = auto till Storage = persistent och slutligen starta om.

Så du hittar normalt systemd-loggfilerna i / var / log / journal. Journalling-systemet är i sig en tjänst som kallas system-journald.service.  Låt oss försöka lista filerna i den här katalogen:

# ls / var / log / journal / -R
/ var / log / journal /:
15e43c1734090ac7fbea6b40fcd99d31
 
/ var / log / journal / 15e43c1734090ac7fbea6b40fcd99d31:
system @ a39da368947bd2ba-231f9bfc18a7a356.journal ~
system @ 62ac1299826d036cb043d6c06a9493b7-0000000000000001-00067d6410099a19.tidning
user-1000 @ b27e98812223a9bc-387e0521703f73d9.journal ~
user-1000 @ 2123bc076b58569fe1fb13e9dbc1b0e0-0000000000000001-0007fe36ac2810e0.tidning
användare-1000.tidning
[många andra filer som de ovan ...]

Eftersom jag vill att du ska fortsätta läsa, var jag tvungen att förkorta utdata eftersom det innehåller många filer (i mitt exempel mer än 60 filer), ledsen för det! Frestad att öppna en kanske?

# head --bytes = 512 / var / log / journal / 15e43c1734090ac7fbea6b40fcd99d31 / [e-postskyddad]
b58569fe1fb13e9dbc1b0e0-00000000000000001-0007fe36ac2810e0.tidning
?s, q?n / FLz???Ulz?l?]????
?_?b???z????o?y1KN ?i?eO??W?u?  ?=?x0?L?d?7??X4n #?e? d3l?
sid??o | MFO:?!qs?.tK??R?\??1?| 5  ????$?g??#?S??;??B7???????t???Y????mN?q????ZQ
?Yv?e?????BD?C?? wF??d |
?2?? 7???????[??Fn?= 8????c?2 = s?&?"   ?0
????*????_??  ???
5?????yk?G? ?6?|??u??w: # 12?Y??
3 TU;???''?jX??2?x '?=??[[e-postskyddad]
[e-postskyddad]?_?>??3S???,lR?.?$?g?L???s?/ E??M1??q???

Hej, det ser inte riktigt ut som de vanliga loggfilerna du ser rätt? Oroa dig inte, den här filen är inte skadad, du har precis upptäckt en aspekt av systemd: systemd lagrar filer i binärt format. Det är därför det är så litet som möjligt: ​​strukturerad data som tid eller plats lagras rakt i binär, vilket vanligtvis tar mindre byte än text. Men det är inte den enda anledningen.

systemd lagrar inte bara logglinjer. Dess avsikt är att göra loggövervakning och utforskning enklare. För att hjälpa till i den här uppgiften är loggmeddelanden i själva verket en textrad tillsammans med data som loggens svårighetsgrad (varning, fel osv.), eller till och med fält som bara skulle vara användbara för din ansökan (URL till exempel begärd).

# journalctl --output = ingående - allt
PRIORITET = 6
_UID = 0
_GID = 0
_CAP_EFFECTIVE = 3fffffffff
_BOOT_ID = ee4cc2ce7e8273aaffb5fc59c873ce7b
_MACHINE_ID = bc422e0feaab64bb7dd218c24e6830e5
_HOSTNAME = linux
SYSLOG_FACILITY = 3
SYSLOG_IDENTIFIER = systemd
ENHET = dnf-makecache.service
_TRANSPORT = journal
_PID = 1
_COMM = systemd
_EXE = / usr / lib / systemd / systemd
_CMDLINE = / usr / lib / systemd / systemd - switched-root --system - deserialize 76
_SYSTEMD_CGROUP = / init.omfattning
_SYSTEMD_UNIT = init.omfattning
_SYSTEMD_SLICE =-.skiva
_SELINUX_CONTEXT = system_u: system_r: init_t: s0
CODE_FILE = src / kärna / jobb.c
CODE_LINE = 795
CODE_FUNCTION = jobb_log_status_meddelande
MESSAGE_ID = a76e08846f5f0971371dbb11126e62e1
MESSAGE = Startade dnf makecache.
# journalctl --catalog --lines = 3000 --pager-end "_TRANSPORT = kärna" RESULTAT = klar
_SOURCE_REALTIME_TIMESTAMP = 1532886335471422

Jag har berättat för dig att det finns många fält (här finns 25 fält eller 29 tidsstämplar som räknas), allt kodavsnittet ovan är endast för ett enda loggmeddelande! Den stora fördelen är att du kan köra en sökning genom att filtrera på vilket fält som helst i detta loggmeddelande. Detta gör att du verkligen kan avancera filtrering.

Ett av de mest uppenbara filter du vill ha är att filtrera efter tjänsten. Som du kan se ovan finns det ett UNIT-fält så att du enkelt kan filtrera för att bara få loggmeddelanden från en tjänst. Jag berättar mer om det senare.

Men den här mängden data betyder också något annat: i nästan alla fall öppnar du aldrig en loggfil manuellt och du kommer aldrig att röra till mappen / var / log / journal. Du använder journalctl för alla uppgifter som är relaterade till loggning. Det finns ingen sådan loggrotationssak, allt hanteras av loggmeddelandets tid.

Antalet fält beror också på hur bra integrationen av systemd är i din applikation. Ju fler fält ett loggmeddelande innehåller, desto bättre är det. För bassystemstjänster har systemd redan tagit hand om att göra en bra integration men för andra applikationer och tjänster varierar kvaliteten på integrationen mycket. Normalt borde detta bli bättre med tiden när människor vänjer sig vid systemd.

Okej, nu är det dags att upptäcka journalctls funktioner.

Mest använda kommandon för journalctl

Det första kommandot du kanske vill titta på är det som visar Linux-kärnans loggar. Ja, systemd hanterar också lagring av kärnans loggar, så att du också kan få loggarna från tidigare stövlar. Här är kommandot:

# journalctl --catalog --lines = 3000 - sida-slut "_TRANSPORT = kärna"

Det visar dig en personsökare där du kan se de senaste meddelandena. Du kan bläddra upp till de sista 3 000 raderna med piltangenterna (↑ / ↓) eller Page Up / Page Down. Flaggan -catalog instruerar journalctl att visa sammanhang runt logglinjer, ungefär som omstart av datorn eller, i andra sammanhang, en tjänst som stoppar / startar. Jag lägger alltid den här flaggan eftersom sammanhang alltid spelar roll, det hjälper att veta i vilken situation logglinjen visades, så du kan gissa varför du fick den här logglinjen.

Nu kanske du bara vill se logglinjerna från den aktuella starten:

# journalctl --catalog --lines = 35000 --pager-end --boot "_TRANSPORT = kärna"

Observera -boot-kommandoradsargumentet fungerar i alla situationer, inte bara med kärnans loggar. Om du föredrar att börja från början:

# journalctl --catalog --boot "_TRANSPORT = kärna"

Jag vet inte om det är fallet för dig, men jag har tillräckligt med kärnloggar! Och hur är det med en allmän översikt över din maskin?

# journalctl --catalog --lines = 3000 - sid-slut

Wow, det händer många saker på ditt system! Lite filtrering skulle vara till hjälp här. Ett av de mest använda filtren är att matcha en viss tjänst (som din SSH-server eller HTTP-server), systemd-enhetens filnamn för SSH-tjänsten är sshd.service, så:

# journalctl --catalog --lines = 3000 --pager-end --enhet = sshd.service

Det är coolt, eller hur?? Det är bara användbart om du vet namnet på tjänsten - men i många fall vet du inte namnet på den tjänsten. Om du befinner dig i en sådan situation kanske du vill ha en lista över tjänsterna, deras beskrivningar och deras status:

# systemctl list-enheter --typ = tjänst

Okej, det här problemet är nu löst. Men ibland har du ett felmeddelande från ett externt system som din egen webbplats eller från ett program på skrivbordet. Så du kommer antagligen vilja söka efter ett visst ord eller en viss mening i loggmeddelandet. Eftersom systemd v237 är det nu möjligt.

I journalctl är sökningen inte skiftlägeskänsligt om ordet du söker är små bokstäver. Så om du söker i ordporten, kommer den också att söka i ordporten med stora bokstäver. Ett exempel:

# journalctl --catalog --lines = 3000 --pager-end --grep = "port"

Nu, om du söker efter ett ord som CPU, kommer det bara att söka i CPU med alla versaler, det kommer inte att söka i CPU.

# journalctl --catalog --lines = 3000 --pager-end --grep = "CPU"

Du kommer ihåg felmeddelandet från det externa systemet? Generellt innehåller dessa meddelanden en tidsstämpel. För att filtrera loggmeddelandet kanske du vill använda den tidsstämpeln. journalctl kan lista alla loggmeddelanden sedan ett visst datum och tid med argumentet -since:

# journalctl --catalog --since = "30-07-2018 09:30:00"

Om det externa systemet är avlägset eller använder UTC-tidsstämplar, vill du filtrera baserat på UTC-datum och tid och visa UTC-tidsstämplarna i terminalen så att du inte behöver konvertera den i ditt huvud, det tenderar att vara riktigt förvirrande. För att göra det måste du lägga till UTC efter tidssträngen i -since-argumentet. Du måste då lägga till flaggan -utc. Så till exempel:

# journalctl --catalog --since = "2018-07-30 10:45:00 UTC" --utc

Observera att du kan använda -utc-flaggan ensam, i det här fallet visar den i princip alla datum och tider i UTC-tidszon.

# journalctl --catalog --lines = 3000 --pager-end --utc

Loggar hanteras bättre med journalctl

Som du kan se med alla tidigare kommandon gör systemd journalföring filtrering och så felsökning enklare eftersom du kan välja mellan alla logglinjer med ett enda kommando, journalctl. Några av er visste antagligen antiken där man var tvungen att manuellt öppna alla filer i / var / log för att få en allmän uppfattning om problemet och vad som hände. Med alla tips du lärde dig här kommer du att ha solida verktyg för att titta på dina loggmeddelanden på det sätt du vill ha det.

Installera det senaste OpenRA-strategispelet på Ubuntu Linux
OpenRA är en Libre / Free Real Time Strategy-spelmotor som återskapar de tidiga Westwood-spelen som det klassiska Command & Conquer: Red Alert. Distri...
Installera senaste Dolphin Emulator för Gamecube & Wii på Linux
Dolphin Emulator låter dig spela dina valda Gamecube & Wii-spel på Linux Personal Computers (PC). Eftersom Dolphin Emulator är en fritt tillgänglig o...
Hur man använder GameConqueror Cheat Engine i Linux
Artikeln täcker en guide om hur du använder GameConqueror-fuskmotorn i Linux. Många användare som spelar spel på Windows använder ofta applikationen "...