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 - alltPRIORITET = 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-slutWow, 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.serviceDet ä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änstOkej, 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" --utcObservera 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 --utcLoggar 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.