Uproszczony, wygląda mniej więcej tak:
Jądro rejestruje komunikaty (za pomocą printk()
funkcji) w buforze pierścieniowym w przestrzeni jądra. Te komunikaty są udostępniane aplikacjom przestrzeni użytkownika na dwa sposoby: poprzez /proc/kmsg
plik (pod warunkiem, że /proc
jest zamontowany) i poprzez połączenie sys_syslog
systemowe.
Istnieją dwie główne aplikacje, które czytają (i do pewnego stopnia mogą kontrolować) bufor pierścieniowy jądra: dmesg(1)
i klogd(8)
. Ten pierwszy ma być uruchamiany na żądanie przez użytkowników, aby wydrukować zawartość bufora pierścieniowego. Ten ostatni jest demonem, który odczytuje wiadomości z /proc/kmsg
(lub wywołuje sys_syslog
, jeśli /proc
nie jest zamontowany) i wysyła je do syslogd(8)
lub do konsoli. To obejmuje stronę jądra.
W przestrzeni użytkownika jest syslogd(8)
. Jest to demon, który nasłuchuje na wielu gniazdach domeny UNIX (głównie /dev/log
, ale inne też można skonfigurować) i opcjonalnie na porcie UDP 514 dla komunikatów. Odbiera również wiadomości od klogd(8)
( syslogd(8)
nie przejmuje się /proc/kmsg
). Następnie zapisuje te wiadomości w niektórych plikach /log
lub nazwanych potokach lub wysyła je do niektórych hostów zdalnych (za pośrednictwem syslog
protokołu, na porcie UDP 514), zgodnie z konfiguracją w /etc/syslog.conf
.
Aplikacje w przestrzeni użytkownika zwykle używają tej libc
funkcji syslog(3)
do rejestrowania wiadomości. libc
wysyła te wiadomości do gniazda domeny UNIX /dev/log
(gdzie są one czytane syslogd(8)
), ale jeśli aplikacja jest chroot(2)
ustawiona na -ed, komunikaty mogą zostać zapisane na innych gniazdach, np /var/named/dev/log
. do . Jest to oczywiście niezbędne dla aplikacji wysyłających te dzienniki i syslogd(8)
uzgodnienia lokalizacji tych gniazd. Z tego powodu syslogd(8)
można skonfigurować słuchanie dodatkowych gniazd poza standardem /dev/log
.
Wreszcie syslog
protokół jest tylko protokołem datagramowym. Nic nie powstrzymuje aplikacji przed wysyłaniem datagramów syslog do dowolnego gniazda domeny UNIX (pod warunkiem, że jej poświadczenia pozwalają jej otworzyć gniazdo), całkowicie omijając syslog(3)
funkcję libc
. Jeśli datagramy są poprawnie sformatowane, syslogd(8)
możesz użyć ich tak, jakby wiadomości zostały wysłane syslog(3)
.
Oczywiście powyższe dotyczy tylko „klasycznej” teorii pozyskiwania drewna. Inne demony (takie jak rsyslog
i syslog-ng
, jak wspomniałeś) mogą zastąpić zwykły syslogd(8)
i robić różne fajne rzeczy, takie jak wysyłanie wiadomości do zdalnych hostów za pomocą szyfrowanych połączeń TCP, dostarczanie znaczników czasu wysokiej rozdzielczości i tak dalej. Jest też systemd
powolny fagocytozowanie części systemu UNIX w Linuksie. systemd
ma własne mechanizmy rejestrowania, ale tę historię musiałby opowiedzieć ktoś inny. :)
Różnice w świecie * BSD:
Na * BSD nie ma klogd(8)
i /proc
albo nie istnieje (na OpenBSD), albo jest w większości przestarzały (na FreeBSD i NetBSD). syslogd(8)
odczytuje komunikaty jądra z urządzenia znakowego /dev/klog
i dmesg(1)
używa /dev/kmem
do dekodowania nazw jądra. Tylko OpenBSD ma /dev/log
. FreeBSD używa dwóch gniazd domeny UNIX /var/run/log
i var/rub/logpriv
zamiast tego, a NetBSD ma /var/run/log
.
rsyslog
nie korzysta z niego,klogd(8)
ponieważ jego korzenie sięgają wstecz, a nie dlatego, że ostatnio podjął wyraźną decyzję o jego zlikwidowaniu. Moja pamięć może się jednak zawodzić. W każdym razie, tak jak powiedziałem, starałem się tylko zakryć „klasyczne” rejestrowanie.rsyslogd
uruchomionym i jeden Ubuntu 12.04 zsyslog-ng
działającym i oba miały/proc/kmsg
otwarty plik zgodnie zlsof
, tj.klogd
Nie był używany. Inną interesującą rzeczą, którą zauważyłem, jest to, że wiadomości dziennika są przechowywane w/proc/kmsg
pliku, jeśli nie działa demon syslog i można je przeglądać na przykład za pomocącat
edytora tekstowego. Można jednak wyświetlić te wiadomości tylko raz, ponieważ znikają po ich wyświetleniu. Wreszcie, wykonaniedmesg
nie powoduje wyczyszczenia zawartości/proc/kmsg
pliku./proc/kmsg
nie jest zwykłym plikiem, nie ma tam niczego „przechowywanego”, jest to tylko widok bufora pierścieniowego jądra. Możesz to przeczytaćcat
właśnie dlatego, że nie maszklogd(8)
uruchomionego (jeśli uruchomiszklogd(8)
,cat /proc/kmsg
zablokuje).dmesg(1)
czyta wiadomości/dev/kmsg
zamiast/proc/kmsg
; i może również wyczyścić bufor, jeśli to zrobisz.systemd has its own logging mechanisms, but that story would have to be told by somebody else. :)
- Proszę powiedzieć, masz talent :-)Druga odpowiedź wyjaśnia, jak mówi jej autor, „klasyczne logowanie” w systemie Linux. W dzisiejszych czasach nie działa to w wielu systemach.
Jądro
Mechanizmy jądra uległy zmianie.
Jądro generuje dane wyjściowe do bufora w pamięci. Oprogramowanie aplikacji może uzyskać do tego dostęp na dwa sposoby. Podsystem rejestrowania zwykle uzyskuje do niego dostęp jako pseudo-FIFO o nazwie
/proc/kmsg
. Tego źródła informacji dziennika nie można z powodzeniem udostępniać między czytnikami dziennika, ponieważ jest on czytany jeden raz. Jeśli współużytkuje je wiele procesów, każdy z nich otrzymuje tylko część strumienia danych dziennika jądra. Jest także przeznaczony tylko do odczytu.Innym sposobem uzyskania dostępu jest nowsze
/dev/kmsg
urządzenie postaci. Jest to interfejs do odczytu i zapisu, który można udostępniać wielu procesom klienckim. Jeśli współużytkuje je wiele procesów, wszystkie odczytują ten sam pełny strumień danych, na które nie mają wpływu. Jeśli otworzą go w celu dostępu do zapisu, mogą również wstrzykiwać wiadomości do strumienia dziennika jądra, tak jakby zostały wygenerowane przez jądro./proc/kmsg
i/dev/kmsg
podać dane dziennika w formie innej niż RFC-5424.Aplikacje
Aplikacje uległy zmianie.
Funkcja biblioteki GNU C
syslog()
w głównych próbach połączenia się zAF_LOCAL
nazwanym gniazdem datagramu/dev/log
i zapisania w nim wpisów dziennika. (Funkcja biblioteki BSD Csyslog()
używa obecnie/var/run/log
jako nazwy gniazda i próbuje/var/run/logpriv
najpierw.) Aplikacje mogą oczywiście mieć własny kod, aby to zrobić bezpośrednio. Funkcja biblioteki to po prostu kod (do otwierania, łączenia, zapisywania i zamykania gniazda), wykonujący w końcu we własnym kontekście procesu aplikacji.Aplikacje mogą również wysyłać wiadomości RFC 5424 za pośrednictwem UDP na lokalny serwer RFC 5426, jeśli nasłuchuje na gnieździe
AF_INET
/AF_INET6
datagramie na komputerze.Dzięki presji ze strony świata Daemontools w ciągu ostatnich dwóch dziesięcioleci wiele dæmons obsługuje działanie w trybie, w którym nie używają
syslog()
funkcji biblioteki GNU C ani gniazd UDP, a jedynie wypluwają swoje dane dziennika do standardowego błędu w zwykła moda na Uniksa.zarządzanie logami za pomocą nosh i ogólnie rodziny daemontools
Dzięki rodzinie zestawów narzędzi daemontools rejestrowanie jest bardzo elastyczne. Ale ogólnie rzecz biorąc, w całej rodzinie chodzi o to, że każdy „główny” demon ma powiązany „rejestr”. „główne” dæmons działają podobnie jak procesy inne niż demon i zapisują swoje komunikaty w dzienniku do standardowego błędu (lub standardowego wyjścia), który podsystem zarządzania usługami łączy za pośrednictwem potoku (który utrzymuje otwarte, aby dane dziennika nie zostały utracone restart usługi) na standardowe wejście dæmon „logowania”.
Wszystkie dæmons „logujące” uruchamiają program, który gdzieś loguje . Ogólnie ten program jest coś
multilog
lubcyclog
że czyta ze standardowego wejścia i zapisuje (nanosekundy o czasie,) plików w ściśle size-ograniczona, obracane automatycznie, wyłączny zapisu, katalog zalogować. Ogólnie rzecz biorąc, wszystkie te demony działają pod egidą indywidualnych dedykowanych nieuprzywilejowanych kont użytkowników.Tak więc powstaje w dużej mierze rozproszony system rejestrowania, w którym dane dziennika każdej usługi są przetwarzane osobno.
Jedno można uruchomić coś podobnego
klogd
lubsyslogd
czyrsyslogd
pod zarządzania usługami daemontools mieszkaniami. Jednak świat Daemontools zdał sobie sprawę wiele lat temu, że struktura zarządzania usługami z „logowaniem” dæmons nadaje się do robienia rzeczy w prostszy sposób. Nie ma potrzeby łączenia wszystkich strumieni dziennika w jeden gigantyczny mish-mash, analizowania danych dziennika, a następnie przekierowywania strumieni z powrotem do osobnych plików dziennika; a następnie (w niektórych przypadkach) przykręcić z boku niewiarygodny mechanizm zewnętrznego obracania kłody. Struktura rodziny daemontools jako część standardowego zarządzania logami już wykonuje rotację logów, zapis plików logów i separację strumienia.Ponadto: model ładowania łańcuchowego upuszczania uprawnień z narzędziami wspólnymi dla wszystkich usług oznacza, że programy rejestrujące nie potrzebują uprawnień administratora; a model UCSPI oznacza, że muszą tylko dbać o różnice, takie jak transport strumieniowy w porównaniu z transportem datagramów.
Zestaw narzędzi nosh jest tego przykładem. Podczas gdy można uruchomić
rsyslogd
pod nim, po wyjęciu z pudełka, i po prostu zarządzać jądrem/run/log
i danymi wejściowymi dziennika UDP w stary sposób; to również zapewnia bardziej „daemontools rodzime” sposoby zalogowaniu te rzeczy:klogd
usługa, która czyta z/proc/kmsg
i po prostu pisze, że strumień dziennika do standardowego błędu. Odbywa się to za pomocą prostego programu o nazwieklog-read
. Powiązany dziennik dæmon przekazuje strumień dziennika ze standardowym wejściem do/var/log/sv/klogd
katalogu dziennika.local-syslog-read
usługa, która czyta z datagramy/dev/log
(/run/log
na BSD) i po prostu pisze, że strumień dziennika do standardowego błędu. Odbywa się to przez program o nazwiesyslog-read
. Powiązany dziennik dæmon przekazuje strumień dziennika ze standardowym wejściem do/var/log/sv/local-syslog-read
katalogu dziennika.udp-syslog-read
usługa nasłuchuje na porcie UDP Syslog, czyta co jest wysyłane do niego i po prostu pisze, że strumień dziennika do standardowego błędu. Ponownie program jestsyslog-read
. Powiązany dziennik dæmon przekazuje strumień dziennika ze standardowym wejściem do/var/log/sv/udp-syslog-read
katalogu dziennika.local-priv-syslog-read
usługa, która odczytuje datagramy/run/logpriv
i po prostu zapisuje strumień dziennika do standardowego błędu. Ponownie program jestsyslog-read
. Powiązany dziennik dæmon przekazuje strumień dziennika ze standardowym wejściem do/var/log/sv/local-priv-syslog-read
katalogu dziennika.Zestaw narzędzi zawiera również
export-to-rsyslog
narzędzie, które może monitorować jeden lub kilka katalogów dziennika (za pomocą systemu nieinwazyjnych kursorów dziennika ) i wysyłać nowe wpisy w formie RFC 5424 przez sieć do wyznaczonego serwera RFC 5426.zarządzanie logami z systemd
Systemd ma jeden monolityczny program zarządzania dziennika
systemd-journald
. Działa to jako usługa zarządzana przez systemd./dev/kmsg
dane dziennika jądra./dev/log
(symboliczny link/run/systemd/journal/dev-log
) do danych dziennika aplikacji z GNU C Library zasyslog()
funkcją.AF_LOCAL
gnieździe w strumieniu/run/systemd/journal/stdout
danych dziennika pochodzących z usług Systemd zarządzane.AF_LOCAL
gnieździe datagramowym na/run/systemd/journal/socket
danych pochodzących z dziennika programów, które mówią protokół czasopism Systemd specyficzne (tjsd_journal_sendv()
et al.)./run/log/journal/
lub/var/log/journal/
.AF_LOCAL
gniazdem datagramu/run/systemd/journal/syslog
, zapisuje tam dane dziennika, jeśli skonfigurowano przekazywanie do syslog./dev/kmsg
mechanizmu zapisu .Złe rzeczy zdarzają się w całym systemie, jeśli ten program ulegnie awarii lub usługa zostanie zatrzymana.
systemd sam organizuje standardowe wyjścia i błędy (niektórych) usług do przyłączenia do
/run/systemd/journal/stdout
gniazda. Więc dæmons, którzy logują się do standardowego błędu w normalny sposób, wysyłają swoje dane wyjściowe do dziennika.To całkowicie zastępuje klogd, syslogd, syslog-ng i rsyslogd.
Wymagane są teraz specyficzne dla systemu. W systemie systemowym nie stają się końcem serwera
/dev/log
. Zamiast tego przyjmują jedno z dwóch podejść:/run/systemd/journal/syslog
, który (jeśli pamiętasz)systemd-journald
próbuje połączyć się i zapisać dane dziennika. Kilka lat temu skonfigurowano by w tymimuxsock
celu metodę wprowadzania rsyslogd .imjournal
celu metodę wprowadzania danych rsyslogd .źródło