Zrozumienie dzienników jest ważne: jeśli kiedykolwiek upadniesz na serwer, który ma błąd lub zostanie zhakowany, ogólnie jedynym sposobem na zrozumienie tego, co się stało. Główną aplikacją, której zamierzamy użyć, jest JournalCtl, stąd nazwa artykułu. Więc słuchaj uważnie, jak we właściwym dniu, możesz z przyjemnością wiedzieć, jak to działa.
Gdzie są przechowywane dzienniki systemowe? I w jakim formacie jest przechowywany?
Założymy się, że masz normalny system, ponieważ SystemD można dostosować do wyjątkowych miejsc. Również niektóre dystrybucje Linux, takie jak Ubuntu 16.04 Domyślnie trwałe rejestrowanie trwałego, które uniemożliwiają systemD do prawidłowego wykonywania swojego zadania. Jeśli masz taką dystrybucję, edytuj/etc/Systemd/Journald.Plik CONF, Zmień Storage = Auto to Storage = Tristent, a na koniec ponownie uruchom ponownie.
Więc normalnie znajdziesz pliki SystemD logs w/var/log/journal. System czasopisma jest samą usługą o nazwie System-Journald.praca. Spróbujmy wymienić pliki w tym katalogu:
# ls/var/log/journal/-r
/var/log/journal/:
15E43C1734090AC7FBEA6B40FCD99D31
/var/log/journal/15e43c1734090ac7fbea6b40fcd99d31:
[email protected] ~
System@62AC1299826D036CB043D6C06A9493B7-0000000000000001-00067D6410099A19.dziennik
[email protected] ~
User-1000@2123BC076B58569FE1FB13E9DBC1B0E0-0000000000000001-0007FE36AC2810E0.dziennik
User-1000.dziennik
[Wiele innych plików, takich jak te powyżej…]
Ponieważ chcę, żebyś czytał dalej, musiałem skrócić dane wyjściowe, ponieważ zawiera wiele plików (w moim przykładzie więcej niż 60 plików), przepraszam za to! Pokusa, aby otworzyć jeden może?
# Head--bajtes = 512/var/log/journal/15e43c1734090ac7fbea6b40fcd99d31/user-1000@2123BC076
B58569FE1FB13E9DBC1B0E0-0000000000000001-0007FE36AC2810E0.dziennik
?S, q?N/flz???Ulz?L?]????
?_?B???z????o?Y1KN ?I?EO??W?u? ?=?x0?L?D?7??X4n#?mi? D3L?
P??O | MFO:?!QS?.tk??R?\??1?| 5 ????$?G??#?S??;??B7???????T???Y????Mn?Q????ZQ
?Yv?mi?????Bd?C?? Wf??D |
?2?? 7???????[[[??Un?= 8????C?2 = p?I?" ?0
????*????_?? ???
5?????yk?G? ?6?|??u??W: #12?Y??
3 tu;???'?JX??2?X'?=??[Q???@Z
T_???3ehmd?@?_?>??3s???,LR?.?$?G?L???S?/MI??M1??Q???
Hej, zobacz, to tak naprawdę nie wygląda jak zwykłe pliki dziennika, które dobrze widzisz? Nie martw się, ten plik nie jest uszkodzony, właśnie odkryłeś aspekt SystemD: Systemd przechowuje pliki w formacie binarnym. Dlatego jest tak mały, jak to możliwe: strukturalne dane, takie jak czas lub lokalizacja, są przechowywane prosto w binarne, co na ogół wymaga mniej bajtów niż tekst. Ale to nie jedyny powód.
SystemD nie tylko przechowuje linie dziennika. Jego celem jest ułatwienie monitorowania i eksploracji dzienników. Aby pomóc w tym zadaniu, komunikaty dziennika są w rzeczywistości wierszem tekstu, które towarzyszy dane takie jak nasilenie dziennika (ostrzeżenie, błąd itp.), a nawet pola, które byłyby przydatne tylko w aplikacji (na przykład żądany adres URL).
# Journalctl --output = Verbose --all
Priorytet = 6
_Uid = 0
_Gid = 0
_Cap_Effective = 3fffffffff
_BOOT_ID = EE4CC2CE7E8273AAFFB5FC59C873CE7B
_Machine_id = BC422E0FEAAB64BB7DD218C24E6830E5
_HostName = Linux
Syslog_facility = 3
Syslog_identifier = Systemd
Jednostka = DNF-MakeCache.praca
_Transport = Journal
_PID = 1
_COMM = Systemd
_Exe =/usr/lib/systemd/systemd
_Cmdline =/usr/lib/systemd/systemd-Switched-Root--System--deserialize 76
_Systemd_cgroup =/init.zakres
_Systemd_unit = init.zakres
_Systemd_Slice =-.plasterek
_SeLinux_Context = System_U: System_r: init_t: S0
Kod_file = src/core/job.C
Code_line = 795
Code_function = Job_log_status_message
Message_id = A76E08846F5F0971371DBB11126E62E1
Wiadomość = uruchomiono dnf makeCache.
# JournalCtl--katalog-Lines = 3000--pager-end "_transport = jądro"
_Source_Realtime_timestamp = 1532886335471422
Powiedziałem ci, że jest wiele pól (oto 25 pól lub 29 liczenia czasu), wszystkie fragmenty powyżej są tylko dla jednego komunikatu z jednego dziennika! Dużą korzyścią jest to, że możesz uruchomić wyszukiwanie, filtrując na dowolnym polu w tym komunikacie dziennika. To naprawdę umożliwia zaawansowane filtrowanie.
Jednym z najbardziej oczywistych filtrów, jaki chcesz, jest filtrowanie przez usługę. Jak widać powyżej, istnieje pole jednostki, dzięki czemu możesz łatwo filtrować, aby uzyskać tylko komunikaty dziennika z jednej usługi. Powiem ci więcej o tym później.
Ale ta ilość danych oznacza również coś innego: w prawie wszystkich przypadkach nigdy nie otworzysz pliku dziennika ręcznie i nigdy nie dotkniesz folderu/var/log/journet. Użyjesz Journalctl do dowolnego zadania związanego z rejestracją. Nie ma takiego rotacji dziennika, wszystko jest zarządzane przez czas komunikatu dziennika.
Również liczba pól będzie zależeć od tego, jak dobra jest integracja SystemD w Twojej aplikacji. Im więcej pola zawiera komunikat dziennika, tym lepiej. W przypadku usług systemowych podstawowych Systemd już zadbał o dobrą integrację, ale w przypadku innych aplikacji i usług, jakość integracji jest bardzo różna. Zwykle powinno to być lepsze z czasem, ponieważ ludzie przyzwyczajają się do systemu.
Okej, teraz nadszedł czas, aby odkryć funkcje JournalCtl.
Najczęściej używane polecenia dla JournalCtl
Pierwszym poleceniem, na które możesz rzucić okiem, jest to, że pokazuje dzienniki jądra Linux. Tak, SystemD obsługuje również przechowywanie dzienników jądra, dzięki czemu można uzyskać również dzienniki poprzednich butów. Oto polecenie:
# JournalCtl--Catalog-Lines = 3000--Pager-End „_transport = jądro”
Pokazuje pager, w którym możesz zobaczyć ostatnie wiadomości. Możesz przewinąć do ostatnich 3000 linii za pomocą klawiszy strzałek (↑ / ↓) lub strony w górę /. Flaga -catalog instruuje JournalCtl, aby wyświetlała kontekst wokół linii dziennika, podobnie jak ponowne uruchomienie komputera lub, w innych kontekstach, zatrzymanie / uruchomienie usługi. Zawsze stawiam tę flagę jako kontekst zawsze ma znaczenie, pomaga wiedzieć, w której sytuacji pojawiła się linia dziennika, więc możesz zgadywać, dlaczego masz tę linię dziennika.
Może teraz chcesz zobaczyć tylko linie dziennika z bieżącego rozruchu:
# Journalctl--Catalog-Lines = 35000--Pager-end --boot "_transport = jądro"
Zwróć uwagę, że argument wiersza poleceń -boot działa we wszystkich sytuacjach, nie tylko z dziennikami jądra. Jeśli wolisz zacząć od początku:
# JournalCtl - -Catalog --boot „_transport = jądro”
Nie wiem, czy tak jest dla ciebie, ale mam dość dzienników jądra! A co z ogólnym przeglądem twojego komputera?
# JournalCtl-Katalog-Lines = 3000--Pager-End
Wow, w twoim systemie dzieje się wiele rzeczy! Pomocne byłoby trochę filtrowania. Jednym z najczęściej używanych filtrów jest dopasowanie określonej usługi (np. Serwera SSH lub serwer HTTP), nazwa pliku jednostki SystemD dla usługi SSH to SSHD.Służba, więc:
# JournalCtl--Catalog-Lines = 3000--Pager-end --unit = sshd.praca
To fajne, prawda?? Cóż, jest to użyteczne tylko wtedy, gdy znasz nazwę usługi - ale w wielu przypadkach nie znasz nazwy tej usługi. Jeśli jesteś w takiej sytuacji, możesz chcieć wymienić usługi, ich opisy i ich status:
# SystemCtl List-Units --Type = Service
Okej, ten problem został teraz rozwiązany. Ale czasami masz komunikat o błędzie, który otrzymujesz z systemu zewnętrznego, takiego jak własna strona internetowa lub z aplikacji na pulpicie. Prawdopodobnie będziesz chciał wyszukać określone słowo lub zdanie w komunikacie dziennika. Od Systemd V237, teraz jest to możliwe.
W JournalCtl wyszukiwanie jest nieczułe, jeśli wyszukiwane słowo jest małe. Więc jeśli przeszukasz port słów, będzie on również przeszukiwał port słów z literami literami. Przykład:
# JournalCtl--Catalog-Lines = 3000--Pager-End--Grep = „Port”
Teraz, jeśli będziesz szukał słowa takiego jak procesor, będzie wyszukiwać proces.
# JournalCtl--Catalog-Lines = 3000--Pager-End--Grep = „CPU”
Pamiętasz komunikat o błędzie z systemu zewnętrznego? Zasadniczo te wiadomości zawierają znacznik czasu. Aby odfiltrować komunikat dziennika, możesz użyć tego znacznika czasu. JournalCtl może wymienić wszystkie wiadomości dziennika od określonej daty i godziny z argumentem -ince:
# Journalctl--katalog--since = "2018-07-30 09:30:00"
Jeśli ten system zewnętrzny jest zdalny lub używa znaczników czasu UTC, będziesz chciał filtrować w oparciu o datę i godzinę UTC oraz wyświetlić w terminalu Znacznik czasu UTC, aby nie musisz go konwertować w głowie, to jest zwykle tak Naprawdę mylące. Aby to zrobić, musisz dodać UTC po ciągu czasu w argumencie -. Następnie będziesz musiał dodać flagę -utc. Na przykład:
# Journalctl--katalog--since = "2018-07-30 10:45:00 UTC" --utc
Uwaga możesz użyć samej flagi -utc, w tym przypadku zasadniczo wyświetli wszystkie daty i czasy w strefie czasowej UTC.
# JournalCtl-Katalog-Lines = 3000--Pager-end --utc
Jak widać w przypadku wszystkich poprzednich poleceń, dziennikowanie SystemD ułatwia filtrowanie, a więc debugowanie łatwiejsze, ponieważ można wybrać wszystkie linie za pomocą pojedynczego polecenia, JournalCtl. Niektórzy z was prawdopodobnie znali starożytne czasy, w których musieliście ręcznie otworzyć każdy plik w /var /log, aby mieć ogólne pojęcie o problemie i tego, co się stało. Ze wszystkimi wskazówkami, których się tutaj nauczyłeś, będziesz mieć solidne narzędzia, aby patrzeć na swoje wiadomości dziennika w sposób, w jaki chcesz.